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

Promise嵌套场景下MongoDB工具服务调用方式优化实现问询

修改MongoDB连接工具以支持Promise链式调用

要实现你想要的调用方式,我们需要调整connect函数的逻辑,让它直接返回一个Promise(不再依赖回调函数),同时保留自动关闭连接的核心能力。下面是调整后的完整代码:

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://your-mongo-url-here'; // 替换为你的实际MongoDB连接地址

module.exports.connect = function() {
  let connection; // 保存连接实例,用于后续自动关闭

  return MongoClient.connect(url)
    .then(conn => {
      connection = conn;
      // 返回指定的数据库实例
      return connection.db('looladb');
    })
    .then(db => {
      // 包装数据库实例,确保后续操作完成后自动关闭连接
      return Promise.resolve(db).finally(() => {
        if (connection) {
          // 捕获关闭连接时的可能错误,避免出现未处理的Promise拒绝
          connection.close().catch(err => 
            console.error('Failed to close MongoDB connection:', err)
          );
        }
      });
    })
    .catch(err => {
      console.error('Error establishing MongoDB connection:', err);
      throw err; // 重新抛出错误,让调用方可以自行捕获处理
    });
};

关键调整说明:

  1. 移除回调参数:不再接受runner回调函数,改为直接返回Promise,让调用方通过.then()获取数据库实例,完全匹配你想要的链式调用风格。
  2. 自动关闭连接:使用Promise.finally()确保无论后续数据库操作成功还是失败,连接都会被关闭。finally会在整个Promise链执行完成后触发,完美适配链式调用的流程。
  3. 错误处理优化:原代码捕获错误后仅打印但不抛出,导致调用方无法感知错误。现在重新抛出错误,让调用方可以通过.catch()自行处理异常。

目标调用方式现在可以正常运行:

mongoClient.connect()
  .then(db => {
    // 记得返回数据库操作的Promise,让finally等待操作完成再关闭连接
    return db.collection("users")
      .find({email: "shani@gmail.com"})
      .toArray();
  })
  .then(out => console.log('db result', out))
  .catch(err => console.error('Database operation failed:', err));

⚠️ 注意:在.then(db => {...})中一定要返回数据库操作的Promise(比如示例中的toArray()返回的Promise),否则finally可能会在数据库操作完成前就关闭连接,导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:19:40