gpt4 book ai didi

node.js - 在 forEach 循环中运行 sequelize 查询。无法处理结果

转载 作者:行者123 更新时间:2023-12-03 22:26:49 25 4
gpt4 key购买 nike

我正在运行这个 sequelize 查询,它返回一些论坛帖子。对于每个结果,我运行第二个查询,它为我提供每个论坛帖子的类别/标签。现在,forEach 循环在所有查询运行之前结束,因为它是异步的,我知道那部分。我如何正确处理这个问题并做我想做的事情?我想将标签/类别数组附加到每个帖子并将帖子数组发送到 ejs View 并调用 next();

我已经尝试过 promise.all() 和 async-await,我确实以这种方式分别获得了类别。但我希望将类别附加到每个帖子对象。

Forum.findAll({
attributes: ["f_post_id", "f_post_title", "like_count", "createdAt"],
limit: limitPost.FORUM,
subQuery: false,
raw: true,
group: ['forum.f_post_title'],

include: [{
attributes: ["user_name"],
model: User,
required: true, // returns everything in a clean single object format
// setting it to false, results in nested arrays
}, {
attributes: [[Sequelize.fn("COUNT", Sequelize.col("forum_answers.answer_id")), "ansCount"]],
model: ForumAnswer,
required: true,
}]
})
.then(fetchedPost => {

fetchedPost.forEach(post => {

ForumTag.findAll({
attributes: [],
raw: true,

where: {
f_post_id: post.f_post_id,
},
include: [{
attributes: ["tag_name"],
model: Tag,
required: true,
}]
})
.then(postTags => {

post.tags = postTags.map(postTag => postTag["tag.tag_name"]);

})
.catch(err => console.log(err));

});

res.locals.fetchedPost = fetchedPost;
next();

})
.catch(err => console.log(err));

这是下面的预期结果:
{ 
f_post_id: 1,
f_post_title: 'learn js',
like_count: 12,
createdAt: 2019-05-19T00:00:00.000Z,
'user.user_name': 'mrscx',
'forum_answers.ansCount': 3,
tags: [ 'JavaScript', 'Database' ]
}


但是由于 forEach 循环结束,标签没有被附加。

我该如何解决?

最佳答案

从表面上看,问题可能与您处理 promise 的方式有关。您实际上并不是在等待 forEach 循环中的 promise 被处理,而是在此之前返回结果。解决这个问题的一种方法是:

Forum.findAll({
attributes: ["f_post_id", "f_post_title", "like_count", "createdAt"],
limit: limitPost.FORUM,
subQuery: false,
raw: true,
group: ['forum.f_post_title'],

include: [{
attributes: ["user_name"],
model: User,
required: true, // returns everything in a clean single object format
// setting it to false, results in nested arrays
}, {
attributes: [[Sequelize.fn("COUNT", Sequelize.col("forum_answers.answer_id")), "ansCount"]],
model: ForumAnswer,
required: true,
}]
})
.then(fetchedPost => {

return Promise.all(fetchedPost.map(post =>
ForumTag.findAll({
attributes: [],
raw: true,

where: {
f_post_id: post.f_post_id,
},
include: [{
attributes: ["tag_name"],
model: Tag,
required: true,
}]
})
.then(postTags => {

post.tags = postTags.map(postTag => postTag["tag.tag_name"]);
return post.save();
})
.catch(err => console.log(err));

}).then(() => {
res.locals.fetchedPost = fetchedPost;
next();
});
})

我敢肯定,还有更优雅的方法可以做这种事情。但这是对原始代码的最少修改。

关于node.js - 在 forEach 循环中运行 sequelize 查询。无法处理结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56216966/

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