NextJS连接MongoDB报错:尝试从已关闭连接池获取连接
MongoDB查询报错:
attempted to check out a connection from closed connection pool 问题现象
仅建立MongoDB连接不执行查询时无异常,执行查询操作后控制台抛出错误attempted to check out a connection from closed connection pool,连接状态仍返回true,客户端在useEffect钩子中输出{},无法正常获取数据库数据。
问题原因
- 异步查询未等待完成就关闭连接:
getServerSideProps中toArray()是异步操作,但未添加await,导致代码直接执行await client.close(),此时查询仍在后台执行,连接池已被关闭,查询尝试获取连接时触发错误。 - 客户端未复用:
getClient每次调用都会创建新的MongoClient实例并发起连接,频繁创建、销毁连接不仅效率低下,还可能引发连接池相关异常。
解决方案
1. 修复查询异步等待逻辑
给查询链末尾的toArray()添加await,确保查询完成后再执行后续操作。
2. 复用MongoClient实例(官方推荐)
利用Node.js模块缓存实现单例客户端,避免重复创建连接。
修改后代码
优化后的MongoDB初始化代码
const { MongoClient } = require('mongodb'); // 模块缓存实现单例客户端,避免重复创建连接 let clientPromise; export function getClient() { if (!process.env.MONGODB_URI) throw new Error("Invalid/missing database key"); if (!clientPromise) { const uri = process.env.MONGODB_URI; const options = {}; const client = new MongoClient(uri, options); clientPromise = client.connect(); console.log("connected to development database"); } return clientPromise; }
修复后的getServerSideProps代码
export async function getServerSideProps(context: any) { try { const client = await getClient(); const db = client.db("db-name"); // db()为同步方法,无需await // 添加await等待查询完成 const post = await db .collection("articles") .find({"type": "nouvelle"}, { projection: { "_id": 0, "title": 1, "titleSlug": 1, "type": 1, "imageUrl": 1, "author": 1 } }) .sort({ $natural: -1 }) .limit(2) .toArray(); // 复用客户端时无需每次请求关闭,除非明确要销毁连接 // await client.close(); return { props: { isConnected: true, post: JSON.parse(JSON.stringify(post)) }, }; } catch (e) { console.error(e); return { props: { isConnected: false, post: null }, }; } }
额外说明
client.db()是同步方法,原代码中的await属于多余操作,可直接移除。- 复用
MongoClient实例是MongoDB官方推荐的最佳实践,能有效减少连接开销,避免连接池相关问题。
内容的提问来源于stack exchange,提问作者Horkos
相关产品推荐
相关产品推荐

