Node.js/Mongoose等待异步for循环



这是一个初学者的问题。我需要查询/找到我的mongodb数据库中数组的多个元素。如果至少有一个元素传递了If语句,我想设置一个错误变量为true。不幸的是,由于异步调用,变量将提前返回并保持为false。你能给我一个提示如何做到这一点吗?下面是到目前为止的代码:

objects = ["a","b","c"]
for (object of objects) {
loanObject.findById(object._id)
.then((object) => {
if (object) {
isError = true
}
})
.catch(err => console.log(err))
}

console.log(isError) // returns false while should be true

使用await和async,你目前正在做的是通过你的数组循环,对于每个元素,你正在触发一个db调用,并告诉它设置isError当它完成时,但你没有等待它,所以你的代码开始3 db调用,然后立即移动到日志isError这是默认情况下我猜在你的代码中是假的。当db调用finish时,isError被设置为true,但是你的代码在此之前执行了console.log。

试试这个:

for (object of objects) {
const object = await loanObject.findById(object._id).catch(err => console.log(err));
if (object) {
isError = true;
}
}

,但更好的解决方案是使用mongoose $in操作符,所以:

const object = await loanObject.findOne({ _id: { $in: objects.map(object => object._id) } }).catch(err => console.log(err));
if (object) {
isError = true;
}

最新更新