为什么我的异步代码不能正常工作,除非我记录的承诺?



我有一些异步代码,使调用mongo数据库和插入/获取项目。当我在本地开发时,下面的代码可以正常工作。但是,当我使mongoose实例连接到MongoDb Atlas时,出现了问题。特别是,似乎我的代码不能正常工作,除非我console.log承诺,这对我没有意义。例如,使用console.log语句,我的所有测试都按预期通过。没有它35次测试失败这是因为我期望的承诺返回null,当它应该从数据库返回一些JSON对象。我的代码没有正确阻塞吗?

感觉我在处理薛定谔的猫…任何帮助都会很感激。提前谢谢。

下面是一个promise/function调用的例子。然后将其传递给_executeQuery。我在相关函数上有await,所以我不认为这是因为我在某个地方错过了await这个词。

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调用工作,但之后的任何调用返回null…

编辑:

。_dbModel是某种猫鼬模式。例如,

const dbSchema= new Schema({
name:  String,
});
const dbModel = mongoose.model('DbSchema', dbSchema);

尝试如下方式替换dbQueryPromise:

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

Mongoose查询不会被执行,除非你传递一个callBack function或使用exec()

对于有类似问题的人,我是这样解决的:

我改变

const dbQueryResult = await dbQueryPromise;

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

最新更新