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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:45