如何在MongoDB Driver的then()块中调用async函数并正确使用finally()?
问题解决办法
错误原因
你遇到的PoolClosedError是因为findDocs是异步操作,但你在.then()回调里没有返回它的Promise,导致Promise链不会等待findDocs执行完成,直接进入finally()块关闭了数据库连接。这时候findDocs还在尝试从已关闭的连接池获取连接,所以抛出错误。
修正后的Promise链式写法
只需要在.then()里返回findDocs的Promise,让Promise链等待异步操作完成后再执行finally:
main() .then((collection) => { return findDocs(collection); // 返回异步操作的Promise,确保链等待它完成 }) .catch(console.error) .finally(() => client.close());
或者更简洁的箭头函数写法:
main() .then(collection => findDocs(collection)) .catch(console.error) .finally(() => client.close());
更推荐的async/await写法
这种写法可读性更强,逻辑更清晰,也更容易避免异步顺序问题:
async function run() { try { // 等待main获取集合对象 const collection = await main(); // 等待findDocs执行完成 await findDocs(collection); } catch (err) { // 捕获所有异常 console.error(err); } finally { // 确保所有操作完成后关闭连接,close如果是异步的建议加await await client.close(); } } // 执行入口函数 run();
额外注意点
- 如果
client.close()是异步方法(MongoDB的Node.js驱动中它确实返回Promise),在finally里加上await可以确保连接完全关闭后再结束程序。 - 永远要确保所有依赖数据库连接的异步操作都完成后,再关闭连接池,否则就会出现类似的连接已关闭错误。
内容的提问来源于stack exchange,提问作者Anurag Dhote
相关产品推荐
相关产品推荐

