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

Posted

技术标签:

【中文标题】Node.js/Mongoose 等待异步 For 循环【英文标题】:Node.js/Mongoose wait for Async For-loop 【发布时间】:2021-10-18 20:15:00 【问题描述】:

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

 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

【问题讨论】:

【参考方案1】:

使用 await 和 async,您当前正在执行的操作是遍历您的数组,对于您正在触发 db 调用并告诉它在完成但您不等待它时设置 isError 的每个元素,所以您的代码开始 3 db 调用,然后立即移动到日志 isError 我猜在你的代码中默认情况下它是 false 。当 db 调用完成时 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;
    

 

【讨论】:

以上是关于Node.js/Mongoose 等待异步 For 循环的主要内容,如果未能解决你的问题,请参考以下文章

antd + node.js + mongoose小总结

Node.JS + Mongoose 回调地狱

??node.js????Mongoose??????

??? MongoDB ??? Node.js ????????? Mongoose ??

Node.js + mongoose [RangeError: 超出最大调用堆栈大小]

Node.js/Mongoose 上的“版本错误:未找到匹配的文档”错误