You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js内置API连接MongoDB:每次请求都会新建连接吗?

MongoDB连接Next.js API的连接复用问题解答

提供的代码实现

/api/blogs/[slug].ts

import type { NextApiRequest, NextApiResponse } from 'next'
import { connectToDatabase } from '../../../database/connectToDatabase'

const allowedReqMethod = "GET"

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
    if (req.method === allowedReqMethod) {
        const slug = req.query.slug
        try{
            const {db} = await connectToDatabase()
            const blog = await db.collection("blogs").findOne({slug})
            res.status(200).json({blog})
        } catch (error) {
            res.status(500).json({ message: "Internal server error" })
        }
    } else {
        res.status(400).json({ message: "Bad request" })
    }
}

connectToDatabase.ts

import { Db, MongoClient } from "mongodb";

const MONGODB_URI = process.env.MONGODB_URI;
const MONGODB_DB = process.env.MONGODB_DB;

let cachedClient: MongoClient;
let cachedDb: Db;

export async function connectToDatabase() {
    // check the cached.
    if (cachedClient && cachedDb) {
        // load from cache
        return {
            client: cachedClient,
            db: cachedDb,
        };
    }

    // set the connection options
    const opts = {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    };

    // check the MongoDB URI
    if (!MONGODB_URI) {
        throw new Error("Define the MONGODB_URI environmental variable");
    }
    // check the MongoDB DB
    if (!MONGODB_DB) {
        throw new Error("Define the MONGODB_DB environmental variable");
    }

    // Connect to cluster
    let client = new MongoClient(MONGODB_URI);
    await client.connect();
    let db = client.db(MONGODB_DB);

    // set cache
    cachedClient = client;
    cachedDb = db;

    return {
        client: cachedClient,
        db: cachedDb,
    };
}

问题解答

  1. 该API每次被调用时,是否都会发起新的数据库连接?
    不会。代码中通过cachedClient和cachedDb两个全局变量实现了连接缓存:
  • 第一次调用connectToDatabase()时,会新建MongoDB客户端连接并初始化数据库实例,同时将这两个实例缓存起来;
  • 后续所有API请求调用该函数时,会直接返回缓存好的客户端和数据库实例,不会重新建立新连接。
  1. 若每次都新建连接,是否属于不良开发实践?
    如果每次请求都新建数据库连接,确实是不良开发实践。因为数据库连接的建立涉及TCP握手、身份认证等开销较大的步骤,频繁新建连接会:
  • 显著增加API的响应延迟;
  • 消耗大量数据库服务器资源,甚至可能触发数据库的最大连接数限制,导致服务不可用。

而你当前的代码采用的连接缓存复用方式,恰恰是推荐的最佳实践,它能有效减少连接开销,提升API性能和资源利用率。

需要注意的是,在Next.js的无服务器部署环境(如Vercel)中,函数实例可能会因闲置被销毁,此时缓存的连接也会失效,但这是平台的正常调度行为,当新请求触发函数实例重建时,会重新建立连接并缓存,不会影响服务稳定性。

内容的提问来源于stack exchange,提问作者najimRizky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:01:55