除非我记录承诺,否则为什么我的异步代码无法正常工作?

Why does my async code not work properly unless I log the promise?

我有一些异步代码可以调用 mongo 数据库和 inserts/fetches 项。当我在本地开发时,下面的代码工作正常。但是,当我将 mongoose 实例连接到 MongoDb Atlas 时,出现了问题。特别是,除非我 console.log 承诺,否则我的代码似乎无法正常工作,这对我来说毫无意义。例如,使用 console.log 语句,我的所有测试都按预期通过了。没有它,35 次测试失败...这是因为我期望 return 的承诺为空,而它应该 return 来自数据库的一些 JSON 对象。我的代码没有正确阻塞吗?

感觉就像我在和薛定谔的猫打交道...任何帮助将不胜感激。提前致谢。

下面是一个 promise/function 调用示例。然后我将它传递给 _executeQuery。我已经等待相关功能,所以我不认为这是因为我在某处遗漏了等待这个词。

async _inSomeAsyncFunction = () => {
      const dbQueryPromise = this._dbModel.findById(_id, modelView).lean();
      await this._executeQuery({ dbQueryPromise, isAccessPermitted: true })
}

_executeQuery 基本上是在用户有权限的情况下得到 promise 的结果。

private _executeQuery = async (props: {
    isAccessPermitted: boolean;
    dbQueryPromise: Promise<any>;
  }): Promise<any> => {
    const { isAccessPermitted, dbQueryPromise } = props;

    if (!isAccessPermitted) {
      throw new Error('Access denied.');
    }
    console.log(dbQueryPromise, 'promise'); // without this line, dbQueryResult would be null...
    const dbQueryResult = await dbQueryPromise;
    return dbQueryResult;
  };

经过更多测试,我发现第一个 API 调用有效,但之后的任何调用 return 都无效...

编辑:

this._dbModel 是一些 mongoose 模式。例如,

 const dbSchema= new Schema({
    name:  String,
  });

 const dbModel = mongoose.model('DbSchema', dbSchema);

尝试按如下方式替换您的 dbQueryPromise:

 const dbQueryPromise = this._dbModel.findById(_id, modelView).lean().exec();

除非您传递 callBack function 或使用 exec()

,否则不会执行 Mongoose 查询

对于遇到类似问题的其他人,以下是我的解决方法:

我变了

const dbQueryResult = await dbQueryPromise;

const dbQueryResult = await dbQueryPromise.then((doc) => {
      return doc;
    });