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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:35:22