node.js - NodeJS mongoose 查询和承诺
问题描述
所以,我是nodejs的新手。我不只是想解决这个问题,我也想学习这个概念。
1 奖有许多获奖者。两者都是单独的表。我首先得到与某个 id 相关的奖品列表。我使用 Promises.all() 遍历这些奖品,然后,对于每个奖品,我查询获胜者。
这是我的代码:
router.post("/getResult", function (req, res) {
const lottery_id = req.body.lottery_id;
const data = [];
//Find list of prices for given lottery_id. Note the sorting applied here
Prize.find({"lotid": lottery_id}).sort({name: 1})
.then(async function (prizes) {
try {
await Promise.all(prizes.map(async (prize) => {
//Sorting here works fine as confirmed by this log.
console.log(prize.name);
await Winner.find({"id": prize._id})
.then(function (winners) {
data.push({
prize: prize,
winners: winners
});
})
}));
//Sorting here is completely messed up.
// Something wrong with second query "Winner.find() and pushing data
res.send({success: 1, data: data});
} catch (err) {
console.log("Error " + err);
res.send({success: 0, data: err});
}
}).catch(function (err) {
res.send({success: 0, error: err});
})
});
我得到的最终结果不遵循应用于奖品的排序。可能是,对于二等奖的查询 Winner.find() 在一等奖之前完成,因此,它在一等奖之前被推送到数据中。
解决方案
您会看到意外的排序结果,因为您将值推送到数据数组的方式没有协调。Prizes.map() 确实会按顺序遍历 Prizes 数组,但是,不能保证每个映射的 promise,或者更具体地说是每个 Winner.find(),都会按时间顺序以相同的顺序实现。
解决此问题的一种方法是使用 Promise.all() 的返回值。这是一个例子:
router.post("/getResult", async function (req, res) {
const lottery_id = req.body.lottery_id;
try {
const prizes = await Prize.find({ "lotid": lottery_id }).sort({ name: 1 });
const prizeWinners = await Promise.all(prizes.map(async function(prize) {
const winners = await Winner.find({ "id": prize._id });
return {
prize,
winners
};
}));
res.send({ success: 1, data: prizeWinners });
} catch (err) {
res.send({ success: 0, error: err });
}
});
推荐阅读
- reactjs - Apexchart Ajax json 渲染
- html - 为什么我的 SVG 图标在使用规则“vertical-align:middle”后没有垂直居中显示?
- erlang - 如何在 Erlang 中找到 utf8 编码二进制文件的字符长度?
- json - 我一直在尝试将 API 用于我一直在制作的股票网站,我的 api 有多个单词,它们之间有空格
- python - 给时间按下电报机器人中的 InlineKeyboardButton 按钮
- typescript - 如何在新标签中打开并使用 Cypres 切换到该标签?
- python - 在数据文件中的特定列上使用熊猫“.value_counts”
- python - 如何通过具有浮点值的“1”矩阵将其转换为“20000”?
- jinja2 - 如何将选择字段中的 form.data 作为烧瓶中的参数
- python - Python 错误:aiogram.dispatcher.dispatcher:获取更新时导致异常