如何解决connection.query异步场景下的变量更新问题?
解决异步查询导致变量未更新的问题
你遇到的核心问题就是异步操作的执行顺序——内层connection.query还没完成赋值,外层代码就已经把temp推进数组并返回响应了。以下是两种可行的解决办法:
方法一:用Promise封装查询,配合async/await
把异步的connection.query包装成Promise,用await等待查询结果返回后再继续执行,确保temp的用户信息被赋值后再存入数组:
router.get("/home/getArticles", (req, res) => { const select_query = "SELECT * FROM `articles` WHERE 1"; connection.query(select_query, async (err, result) => { if (err) { return res.status(500).json({ message: "Error while processing your request" }); } const final_data = []; // 用for...of循环支持await,forEach不兼容异步等待 for (const article of result) { const temp = {}; const current_user_id = article.user_id; // 改用参数化查询,避免SQL注入风险 const select_user_query = "SELECT user_name, user_profile_image FROM `users` WHERE `user_id`=?"; // 把查询包装成Promise,等待结果 const innerResult = await new Promise((resolve, reject) => { connection.query(select_user_query, [current_user_id], (err, data) => { if (err) reject(err); else resolve(data); }); }); temp.user_name = innerResult[0].user_name; temp.user_image = innerResult[0].user_profile_image; temp.title = article.title; temp.body = article.detail; final_data.push(temp); } return res.status(200).json({ data: final_data }); }) })
方法二:用SQL JOIN一次性查询(更推荐)
直接通过SQL的JOIN语句关联articles和users表,一次查询就能拿到所有需要的数据,彻底避免异步嵌套的问题,性能也更好:
router.get("/home/getArticles", (req, res) => { // 关联两张表,只查询需要的字段,减少数据传输 const select_query = ` SELECT a.title, a.detail AS body, u.user_name, u.user_profile_image AS user_image FROM articles a INNER JOIN users u ON a.user_id = u.user_id `; connection.query(select_query, (err, result) => { if (err) { return res.status(500).json({ message: "Error while processing your request" }); } // 查询结果直接就是最终需要的格式,无需额外处理 return res.status(200).json({ data: result }); }) })
内容的提问来源于stack exchange,提问作者Dinesh Kuniyal
相关产品推荐
相关产品推荐

