You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:15:03