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, }; }
问题解答
- 该API每次被调用时,是否都会发起新的数据库连接?
不会。代码中通过cachedClient和cachedDb两个全局变量实现了连接缓存:
- 第一次调用
connectToDatabase()时,会新建MongoDB客户端连接并初始化数据库实例,同时将这两个实例缓存起来; - 后续所有API请求调用该函数时,会直接返回缓存好的客户端和数据库实例,不会重新建立新连接。
- 若每次都新建连接,是否属于不良开发实践?
如果每次请求都新建数据库连接,确实是不良开发实践。因为数据库连接的建立涉及TCP握手、身份认证等开销较大的步骤,频繁新建连接会:
- 显著增加API的响应延迟;
- 消耗大量数据库服务器资源,甚至可能触发数据库的最大连接数限制,导致服务不可用。
而你当前的代码采用的连接缓存复用方式,恰恰是推荐的最佳实践,它能有效减少连接开销,提升API性能和资源利用率。
需要注意的是,在Next.js的无服务器部署环境(如Vercel)中,函数实例可能会因闲置被销毁,此时缓存的连接也会失效,但这是平台的正常调度行为,当新请求触发函数实例重建时,会重新建立连接并缓存,不会影响服务稳定性。
内容的提问来源于stack exchange,提问作者najimRizky
相关产品推荐
相关产品推荐

