使用mongoose和express在多次异步查询后发送响应



我试图列出发送给客户端的产品,但res.send在循环完成之前就被执行了。你有什么建议吗?异步/等待似乎不起作用。

这是我的代码:

const Outfits = require("../models/Outfits");
const Products = require("../models/Products");
module.exports = (req, res) => {
Outfits.find({ outfitId: req.params.id }, async (error1, result) => {
if (error1) {
res.status(400).json({
status: "fail",
});
} else {
let productIds = result[0].productIds;
let productList = [];
for (let i = 0; i < productIds.length; i++) {
await Products.find({ id: productIds[i] })
.then((product) => {
console.log(product);
productList.push(product);
})
.catch((error2) => {
res.status(400).json({
status: "fail",
});
});
}
console.log(productList);
res.status(200).json({
status: "success",
body: productList,
});
}
});
};

非常感谢!

为了同时执行多个异步任务,一种更干净的方法是使用Promise.all并传递异步任务的数组。像这样:

const Outfits = require("../models/Outfits");
const Products = require("../models/Products");
module.exports = (req, res) => {
Outfits.find({ outfitId: req.params.id }, async (error1, result) => {
if (error1) {
res.status(400).json({
status: "fail",
});
} else {
let productIds = result[0].productIds;

//
const productList = await Promise.all(
productIds.map((id) => Products.findById(id))
);

console.log(productList);
res.status(200).json({
status: "success",
body: productList,
});
}
});
};

您需要像这个一样在Products.find函数上调用await

for (let i = 0; i < productIds.length; i++) {
try {
const product = await Products.find({ id: productIds[i] }).exec()
console.log(product);
productList.push(product);
} catch (error) {
res.status(400).json({
status: "fail",
});
}
}

你有什么建议吗?异步/等待似乎不起作用

代码中的async/await不起作用,因为mongoose为您提供了函数,所以它是

  1. 回调样式

    //找到装备并将装备传递给回调

    Outfits.find({outfitId:req.params.id},async(error1,assembly(=>{

    //您的其他逻辑

    })

  2. 异步/等待式

    //找到装备并返回

    const装备=等待Outfits.find({outfitId:req.params.id}(.exec((;

假设您以这种方式检索产品id的数组

let productIds = result[0].productIds;
const products = await Promise.all(
productIds.map((productId)=>{
return Products.findById(productId)
}
)

这将为您检索产品列表

这是我第一次回答一个问题,所以这个答案很努力哈哈:(。

最新更新