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

