Node.js使用mysql2时出现Async Await错误且Array输出为空
问题原因与解决方案
问题根因
- 语法错误
SyntaxError: await is only valid in async function的触发原因:你在userdata[0].map()的普通同步回调函数中直接使用了await关键字,await只能在标记了async的异步函数内部使用。 console.log(userTasklist)输出空数组的触发原因:数据库查询是异步操作,你没有等待所有异步查询执行完成就打印数组,此时异步逻辑还没执行到userTasklist.push(objtask)的步骤。
修复方案
你需要把map的回调改为异步函数,同时用Promise.all等待所有异步查询执行完毕,修改后的完整代码如下:
const mysql = require('mysql2/promise'); // 创建数据库连接 const connection = async ()=> { return await mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'whosin' }) } exports.allUserList = async (req, res) => { let db; try { db = await connection(); const userID = req.params.userid; const userdata = await db.query('SELECT name, user_id, employee_code FROM users WHERE under_gh = ?', [userID]); if (userdata[0] && userdata[0].length > 0) { let userTasklist = []; // 用Promise.all等待所有异步查询执行完成 await Promise.all(userdata[0].map(async (datauser) => { const taskdata = await db.query("SELECT DATE_FORMAT(created_date, '%Y-%m-%d') as created_date, created_time, tasklist, user_id, DATE_FORMAT(created_by, '%Y-%m-%d') as date, DATE_FORMAT(created_by, '%H:%i:%s') as time FROM tasklist where user_id = ?", [datauser.user_id]); if (taskdata[0] && taskdata[0].length > 0) { const objtask = { userid: datauser.user_id, tasklist: taskdata[0] } console.log(objtask); userTasklist.push(objtask); } })) // 所有异步任务执行完成后再打印、返回数据 console.log(userTasklist) res.send({ message: "user list fetched", userdata: userdata[0], tasklistdata: userTasklist }) } else { res.send({ message: "no user found", userdata: [], tasklistdata: [] }) } } catch (err) { console.error('接口执行出错:', err); res.status(500).send({ message: "server error", error: err.message }) } finally { // 执行完毕后释放数据库连接,避免连接泄漏 if (db) await db.end(); } }
补充说明
如果不需要保留没有任务数据的用户,也可以直接用map返回objtask再过滤掉空值,不需要单独维护userTasklist数组,代码会更简洁。
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

