gpt4 book ai didi

javascript - 带有 promise 的 MySQL - 失去值(value)

转载 作者:搜寻专家 更新时间:2023-10-31 23:40:35 25 4
gpt4 key购买 nike

在下面的代码中,目标是为每个帖子填充 likes 字段。我正在查询帖子表并将帖子转换为一个对象。基于此转换后的结果集中的值,我查询 likes 表并尝试将相应的 likes 结果集动态添加到 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);
});
});

最佳答案

变化:

  1. 只需将映射链接在一起
  2. 映射时不需要使用 i 进行访问,因为该项目已作为第一个参数给出
  3. 由于您正在映射 promise ,因此您必须使用类似 Promise.all 的东西来解决它们
  4. 您已经解决了connection.then,无需再次执行。您可以重用上层作用域中的 conn
  5. 也许您还可以将复制的对象提取到助手中以进一步清理

代码如下:

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);
})

关于javascript - 带有 promise 的 MySQL - 失去值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45146397/

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