Node.js .map函数中的多个查询
我试图为每个帖子返回一个postData数组。出于某种原因,它一直为这些对象打印null,因为返回res.json在承诺完成之前就已经运行了。感谢您的帮助Node.js .map函数中的多个查询,node.js,postgresql,promise,array.prototype.map,Node.js,Postgresql,Promise,Array.prototype.map,我试图为每个帖子返回一个postData数组。出于某种原因,它一直为这些对象打印null,因为返回res.json在承诺完成之前就已经运行了。感谢您的帮助 我以前遇到过这个问题,并且使用了相同的代码,但出于某种原因,它对这个问题不起作用。您仍然没有使用承诺,而是将回调传递给查询。您不能从这些中返回,而且它们不会被承诺所等待。所有的。你在找什么 const returnPostData = async (req, res, initialPostsQueryArray) => { t
我以前遇到过这个问题,并且使用了相同的代码,但出于某种原因,它对这个问题不起作用。您仍然没有使用承诺,而是将回调传递给
查询。您不能从这些中返回,而且它们不会被承诺所等待。所有的。你在找什么
const returnPostData = async (req, res, initialPostsQueryArray) => {
try{
const promises = initialPostsQueryArray.map( async (post) => {
let voteCount = 0;
let voted = false;
let liked = false;
let userHandle;
let userImageUrl;
let votingOptionsDictionary;
let userVoteOption;
voteCount = sumValues(post.voting_options);
pool.query('SELECT userhandle, image_url FROM users WHERE id = $1 ',
[post.user_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
const userPostquery = results.rows[0];
userHandle = userPostQuery.userhandle;
userImageUrl = userPostQuery.image_url;
pool.query('SELECT EXISTS( SELECT 1 FROM likes WHERE user_id = $1 AND post_id = $2)',
[req.user.userId, post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
// if the user like exists, set liked = true
if(results.rows[0].exists == true){
liked = true;
}
pool.query('SELECT EXISTS( SELECT 1 FROM votes WHERE user_id = $1 AND post_id = $2)',
[req.user.userId, post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
// if the user vote exists, set voted = true and query for what they voted for
if(results.rows[0].exists == true){
voted = true;
votingOptionsDictionary = post.voting_options;
pool.query('SELECT voting_option FROM votes WHERE user_id = $1 AND post_id = $2',
[req.user.userId, post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
userVoteOption = results.rows[0].voting_option;
});
}
// i dont need voteCount here because that is calculated after the first query, this gets all the counts of the posts
pool.query('SELECT posts.post_id, ' +
'COALESCE( likes.cnt, 0 ) AS like_count ,' +
'COALESCE( comments.cnt, 0 ) AS comment_count ,' +
'COALESCE( shares.cnt, 0 ) AS share_count ' +
'FROM posts ' +
'LEFT JOIN ( SELECT post_id, COUNT(*) AS cnt FROM likes GROUP BY post_id ) likes ON posts.post_id = likes.post_id ' +
'LEFT JOIN ( SELECT post_id, COUNT(*) AS cnt FROM comments GROUP BY post_id ) comments ON posts.post_id = comments.post_id ' +
'LEFT JOIN ( SELECT post_id, COUNT(*) AS cnt FROM shares GROUP BY post_id ) shares ON posts.post_id = shares.post_id ' +
'WHERE posts.post_id = $1',
[post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
const countQuery = results.rows[0];
// final response once all above queries are done, i dont account for thread comments in comment count rn, later problem
return {
postId: post.post_id,
userHandle: userHandle,
userImageUrl: userImageUrl,
postQuestion: post.post_question,
imageUrl: post.post_image_url,
postDescription: post.post_description,
votingOptions: Object.keys(post.voting_options),
voted: voted,
userVoteOption: userVoteOption,
liked: liked,
votingOptionsDictionary: votingOptionsDictionary,
voteStat: voteCount,
likeCount: parseInt(countQuery.like_count),
shareCount: parseInt(countQuery.share_count),
commentCount: parseInt(countQuery.comment_count),
createdAt: post.created_at
};
});
});
});
});
});
const postData = await Promise.all(promises);
return res.json(postData);
}
catch(e){
return res.json(e)
}
}
您仍然没有使用承诺,而是将回调传递给query
。您不能从这些中返回,而且它们不会被承诺所等待。所有的。你在找什么
const returnPostData = async (req, res, initialPostsQueryArray) => {
try{
const promises = initialPostsQueryArray.map( async (post) => {
let voteCount = 0;
let voted = false;
let liked = false;
let userHandle;
let userImageUrl;
let votingOptionsDictionary;
let userVoteOption;
voteCount = sumValues(post.voting_options);
pool.query('SELECT userhandle, image_url FROM users WHERE id = $1 ',
[post.user_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
const userPostquery = results.rows[0];
userHandle = userPostQuery.userhandle;
userImageUrl = userPostQuery.image_url;
pool.query('SELECT EXISTS( SELECT 1 FROM likes WHERE user_id = $1 AND post_id = $2)',
[req.user.userId, post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
// if the user like exists, set liked = true
if(results.rows[0].exists == true){
liked = true;
}
pool.query('SELECT EXISTS( SELECT 1 FROM votes WHERE user_id = $1 AND post_id = $2)',
[req.user.userId, post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
// if the user vote exists, set voted = true and query for what they voted for
if(results.rows[0].exists == true){
voted = true;
votingOptionsDictionary = post.voting_options;
pool.query('SELECT voting_option FROM votes WHERE user_id = $1 AND post_id = $2',
[req.user.userId, post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
userVoteOption = results.rows[0].voting_option;
});
}
// i dont need voteCount here because that is calculated after the first query, this gets all the counts of the posts
pool.query('SELECT posts.post_id, ' +
'COALESCE( likes.cnt, 0 ) AS like_count ,' +
'COALESCE( comments.cnt, 0 ) AS comment_count ,' +
'COALESCE( shares.cnt, 0 ) AS share_count ' +
'FROM posts ' +
'LEFT JOIN ( SELECT post_id, COUNT(*) AS cnt FROM likes GROUP BY post_id ) likes ON posts.post_id = likes.post_id ' +
'LEFT JOIN ( SELECT post_id, COUNT(*) AS cnt FROM comments GROUP BY post_id ) comments ON posts.post_id = comments.post_id ' +
'LEFT JOIN ( SELECT post_id, COUNT(*) AS cnt FROM shares GROUP BY post_id ) shares ON posts.post_id = shares.post_id ' +
'WHERE posts.post_id = $1',
[post.post_id],
(error, results) => {
if (error) {
console.log(error);
return res.json({'Error': error.detail});
}
const countQuery = results.rows[0];
// final response once all above queries are done, i dont account for thread comments in comment count rn, later problem
return {
postId: post.post_id,
userHandle: userHandle,
userImageUrl: userImageUrl,
postQuestion: post.post_question,
imageUrl: post.post_image_url,
postDescription: post.post_description,
votingOptions: Object.keys(post.voting_options),
voted: voted,
userVoteOption: userVoteOption,
liked: liked,
votingOptionsDictionary: votingOptionsDictionary,
voteStat: voteCount,
likeCount: parseInt(countQuery.like_count),
shareCount: parseInt(countQuery.share_count),
commentCount: parseInt(countQuery.comment_count),
createdAt: post.created_at
};
});
});
});
});
});
const postData = await Promise.all(promises);
return res.json(postData);
}
catch(e){
return res.json(e)
}
}
非常感谢你!我真的很感激!工作得很好。我也不知道如何多行查询,直到现在。我知道+字符串是一种浪费,非常感谢!我真的很感激!工作得很好。我也不知道如何多行查询,直到现在。我知道+字符串是一个浪费lol