gpt4 book ai didi

mysql - 使用 sequelize 等待查询

转载 作者:搜寻专家 更新时间:2023-11-01 00:28:48 24 4
gpt4 key购买 nike

我目前正在将 Node.js 与 Sequelize (MySQL) 结合使用,并且有两个模型之间存在关联:M.belongsTo(C)。我要做的是查询所有 C 并将属于 C 的所有 M 添加到返回的 JSON 对象中。请参阅下面代表我最新尝试的代码:

C.findAll({
where: {
parent_ids: ids
}
}).then(cs => {
let fCs = [];
for (let j = 0; j < cs.length; j++) {
let c = cs[j].get({ plain: true });

M.findAll({
where: {
CId: c._id
}
}).then(ms => {
let cMs = [];
for (let k = 0; k < ms.length; k++) {
cMs.push(ms[k].get({ plain: true }));
}

c.ms = cMs;
});

fCs.push(c);
}

return res.json({
success: true,
cs: fCs
});
}).catch(error => {
return res.json({
success: false
});
});

问题是 M 模型的内部查询是作为异步查询进行的,我在执行任何查询之前就得到了响应。我也尝试使用 Promise.all(),但我无法使其正常工作,因为我在外部 C 查询中进行迭代。

如何让它按预期工作?

最佳答案

由于数据库查询是异步操作,循环在不执行任何查询的情况下完成,因此为了防止这种情况将所有 findAll 调用推送到数组,Promise.all(arrayOfPromises) 将在所有 findAll promise 成功解决后解决这些 promise 。

var fCs = [], cs,
C.findAll({
where: {
parent_ids: ids
}
}).then(data => {
cs = data;
var promises = [];
for (let j = 0; j < cs.length; j++) {
let c = cs[j].get({ plain: true });

promises.push(M.findAll({
where: {
CId: c._id
}
}).then(ms => {
let cMs = [];
for (let k = 0; k < ms.length; k++) {
cMs.push(ms[k].get({ plain: true }));
}

return cMs;
}));
}
return Promise.all(promises)
}).then(result => {
fcs = cs.map((el, index) => {
let obj = el.get({plain: true})
obj.ms = result[index]
return obj
})
return res.json({
success: true,
cs: fCs
});
}).catch(error => {
return res.json({
success: false
});
});

关于mysql - 使用 sequelize 等待查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com