JS中MongoDB的findOne方法查询结果无法返回至主方法问题处理
核心问题定位
你遇到的object为undefined、程序卡在打印查询结果的环节不再继续执行的根因,是connectAndReturnWithFunction方法的Promise封装完全断了链路:
- 你在这个方法里new了一个Promise,但是从头到尾没有调用过
resolve或者reject,导致这个Promise永远处于pending状态 - 你在MongoDB连接的回调里写的
return func(db),这个return值是属于mongoClient.connect的回调函数的,和外层包裹的Promise没有任何关系,根本不会成为Promise的兑现值 - 连接出错时只打印日志不抛出错误,也会导致异常被静默吞掉
第一步:修正connectAndReturnWithFunction的封装逻辑
把内部的执行结果显式和Promise的状态绑定,修正后代码如下:
async connectAndReturnWithFunction(func) { return new Promise((resolve, reject) => { mongoClient.connect(url, {}, (error, client) => { // 连接出错时主动reject抛出,不要仅打印日志就中断流程 if (error) { console.log("Cannot connect to db"); return reject(error); } console.log("Database connection established: " + dbname); const db = client.db(dbname); // 执行传入的查询逻辑,把异步返回的结果绑定到Promise的resolve上 func(db) .then(queryRes => resolve(queryRes)) .catch(queryErr => reject(queryErr)); }) }) }
第二步:简化getFirstObjectFromBase的实现
你之前尝试的两种查询写法,在上述封装修正完成后,都可以正常跑通,完全不需要在查询的回调里手动return结果:
async getFirstObjectFromBase(collection) { // 直接返回findOne的Promise结果,外层封装会自动把结果传递出去 return await this.connectAndReturnWithFunction(db => { return db.collection(collection).findOne({}); }) }
补充优化建议:MongoDB客户端连接是可复用的长连接,不需要每次查询都执行一次connect流程,应用启动时完成一次连接初始化、把db实例存下来复用,能避免每次查询都重建连接的性能开销。
内容的提问来源于stack exchange,提问作者damlit
相关产品推荐
相关产品推荐

