在下面的代码中,目标是为每个帖子填充点赞字段.我正在查询posts表并将post转换为对象.基于此转换结果集中的值,我正在查询点赞表,并尝试将相应的点赞结果集动态添加到posts对象,如下所示.
Likes字段似乎已成功添加到map函数中.但是,由于处理promise的某些问题,likes字段在then()代码块外部不存在.
知道为什么会这样吗?感谢您提供有关如何解决此问题的帮助.
router.post('/load', (req, res) => {
connection.then( (conn) => {
return conn.query("SELECT userId, postId FROM posts");
}).then( (postsRows) => {
let posts = postsRows.map((r) => Object.assign({}, r));
posts = posts.map( (post, i) => {
if( posts[i].totalLikes ) {
connection.then( (conn) => {
return conn.query("SELECT u.userId, u.first, u.last FROM likes l JOIN posts p ON p.postId = l.postId JOIN users u ON u.userId = l.userId WHERE p.postId = ?", [post.postId]);
}).then( (likesRows) => {
posts[i].likes = likesRows.map((r) => Object.assign({}, r));
});
}
});
return posts;
}).then( (posts) => {
console.log(posts);
});
});
解决方法:
变化:
>只需将映射链接在一起
>映射时无需使用i进行访问,因为该项目已作为第一个参数给出
>由于您正在映射承诺,因此必须使用Promise.all之类的东西来解决它们
>您已经解决了连接问题,然后无需再次进行连接.您可以从上层范围重用conn.
>也许您也可以将复制的对象提取到帮助程序中以进一步清理内容
这是代码:
const copyObject = o => Object.assign({}, o));
connection.then(conn =>
conn
.query("SELECT userId, postId FROM posts")
.then(postRows => Promise.all(
postRows
.map(copyObject)
.map((post) => {
const getLikes = post.totalLikes
? conn.query("SELECT u.userId, u.first, u.last FROM likes l JOIN posts p ON p.postId = l.postId JOIN users u ON u.userId = l.userId WHERE p.postId = ?", [post.postId])
: Promise.resolve([]);
return getLikes
.then(likesRows => {
post.likes = likesRows;
return post;
});
})
))
)
.then(posts => {
console.log(posts);
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。