【问题标题】:Can't push object into the array after running mongodb query运行 mongodb 查询后无法将对象推送到数组中
【发布时间】:2023-03-10 17:09:02
【问题描述】:

我试图设置将一些项目添加到数组中的逻辑,id 的快速服务器从客户端接收。我的程序接收到产品的 id,然后我从 MongoDB 查询 findOne 中获取产品详细信息,然后使用一些自定义的详细信息,我曾经将该项目推送到数组中,但它不起作用,每当我尝试在 MongoDB 之后推送任何元素时查询它不起作用,我不知道为什么,但请帮助我,对不起我的英语不好!

这是一个使用 MongoDB 的 ExpressJS 服务器

收到的物品:(但实际上是以JSON的形式从客户端收到的):

const items= [
        {
            productId:"61e01e7e24612b56c33b06c3",
            quantity:"4"
        },
        {
            productId:"61e01e9024612b56c33b06c6",
            quantity:"10"
        }
    ]

这里的实际代码是问题所在

let itemsData = [];
items.forEach(async (item) => {
    const itemData = await findProduct({ _id: item.productId });

    // Check if product found
    if (!itemData) return res.status(400).json({ message: "Product is Invalid" });

    // If found add that in object
    itemsData.push({
        productId: itemData._id,
        name: itemData.name,
        price: itemData.price,
        quantity: item.quantity,
        unit: "Nos",
        totalPrice: parseInt(itemData.price) * parseInt(item.quantity)
    });
});

上面的代码不会将该对象推送到itemsData 数组

findProduct函数

// Service to find Product
async findProduct(filter) {
    return await ProductModel.findOne(filter);
}

如果我使用该推送方法并在 MongoDB 查询之前仅尝试 itemsData.push("hello"); 它可以工作,但如果我将它放在 findProduct 查询之后它就不起作用!我不知道它有什么问题!谁来帮帮我!

我只想将那些有细节的项目愉快地推送到 itemData 对象中,这没有发生我尝试console.log(itemsData)它只是返回[],我该怎么办?

【问题讨论】:

    标签: node.js arrays mongodb express


    【解决方案1】:

    尝试使用 For Of 而不是 forEach(不要忘记添加 async

      let itemsData = [];
      
      for (const item of items) {
        const itemData = await findProduct({ _id: item.productId });
        
        // Check if product found
        if (!itemData) return res.status(400).json({ message: "Product is Invalid" });
        
        // If found add that in object
        itemsData.push({
            productId: itemData._id,
            name: itemData.name,
            price: itemData.price,
            quantity: item.quantity,
            unit: "Nos",
            totalPrice: parseInt(itemData.price) * parseInt(item.quantity)
        });
      }
    

    【讨论】:

    • 谢谢@Nacho,这很好用,没有任何错误,我不知道为什么它不适用于map 答案,它只是[undefined, undefined],你的答案很棒,谢谢你救了我! ?
    【解决方案2】:

    这是因为 forEach 函数不是为异步调用而设计的。

    你可以用地图代替。

    这应该可行:

    let itemsData = [];
    
    const promises = items.map(async (item) => {
     const itemData = await findProduct({ _id: item.productId });
    
     // Check if product found
     if (!itemData) return res.status(400).json({ message: "Product is Invalid" });
    
     return {
      productId: itemData._id,
      name: itemData.name,
      price: itemData.price,
      quantity: item.quantity,
      unit: "Nos",
      totalPrice: parseInt(itemData.price) * parseInt(item.quantity)
     };
    });
    
    itemsData = await Promise.all(promises);
    

    当您将 map 与 async 一起使用时,您将拥有一组 Promise,因此您可以使用 Promise.all 等待值得到解决。

    查看this了解更多详情。

    【讨论】:

    • 我只是按照您的建议进行了尝试,但最后当我在控制台中登录时,它是[undefined, undefined],但现在它可以用于回答谢谢先生,我不知道@ 987654324@存在,但是用for语句解决了问题,谢谢
    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2020-05-21
    • 2016-12-26
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多