我試圖設定將一些專案添加到陣列中的邏輯,該陣列是 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)讓它回傳[],我該怎么辦?
uj5u.com熱心網友回復:
嘗試使用 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)
});
}
uj5u.com熱心網友回復:
這是因為 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 等待值得到解決。
查看此內容以獲取更多詳細資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418433.html
標籤:
