如何在不同JS文件间传递Mongoose查询结果?代码报错求助
你的Mongoose Promise调用问题分析与修复
我帮你梳理下代码里的问题,其实主要是两个关键点没处理好:
问题点
- 函数没有返回Promise对象:你的
FindinCol1函数没有返回任何值,导致在route.js里调用.then()时,相当于对undefined调用then方法,直接报错。 - 错误使用resolve:你在函数里直接写了
resolve(user),但resolve并不是全局可用的——它只有在new Promise((resolve, reject) => { ... })的回调函数里才存在,这里的resolve会被当作未定义变量抛出错误。
修正方案
其实Mongoose的exec()方法本身就会返回一个Promise,所以我们可以直接利用它,不需要额外绕弯子,下面是修正后的代码:
修正后的config.js
module.exports = { FindinCol1: function() { console.log("Inside promise"); // 直接返回Mongoose查询的Promise实例 return mongo.configuration.findOne({}).exec() .then(function(user){ console.log(user); // 这里原来写的是console.log("user"),改成打印实际的user对象方便调试 return user; // 将查询结果传递给下一个then }) .catch(function(err){ console.log(err); throw err; // 抛出错误,让调用方的错误回调能捕获到 }); } };
route.js不需要修改
你的route.js调用逻辑是对的,修正config.js之后,就能正常获取到查询结果了。
另一种可选写法(显式封装Promise)
如果之后你需要在查询前后做更多异步操作,也可以显式创建Promise来封装逻辑,代码如下:
module.exports = { FindinCol1: function() { console.log("Inside promise"); return new Promise((resolve, reject) => { mongo.configuration.findOne({}).exec() .then(function(user){ console.log(user); resolve(user); // 这里的resolve是Promise构造函数提供的,合法可用 }) .catch(function(err){ console.log(err); reject(err); // 传递错误给调用方 }); }); } };
关键总结
- 一定要确保你的异步函数返回Promise实例,这样调用方才能通过
.then()/.catch()处理结果和错误。 - Mongoose的查询方法(配合
exec())本身就支持Promise,直接返回它是最简洁的写法。 - 不要在非Promise构造函数的回调里乱用resolve/reject,这些方法是Promise内部专属的。
内容的提问来源于stack exchange,提问作者Vishnu
相关产品推荐
相关产品推荐

