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

如何让代码按指定顺序执行?MySQL查询返回undefined问题求助

问题解决:异步MySQL查询结果无法正确获取

问题根源

  1. Query.getDepartment方法无有效返回值:db.query是异步回调逻辑,回调函数里的return仅作用于回调内部,无法将查询结果传递给外部调用者,因此调用getDepartment()会直接得到undefined。
  2. 原代码中addRole调用时机错误:const声明的函数表达式不会被变量提升,原代码先调用addRole再定义函数,会导致调用时函数未定义(当前主要问题是departments为undefined,但这个问题也需同步修复)。

修复步骤

1. 修改query.js:将异步查询包装为Promise

把getDepartment改成返回Promise,让外部可以通过async/await等待异步结果:

class Query {
    getDepartment() {
        return new Promise((resolve, reject) => {
            db.query('SELECT name FROM department', (err, res) => {
                if (err) {
                    // 传递错误信息,方便外部捕获处理
                    reject(err);
                    return;
                }
                // 查询成功时返回结果
                resolve(res);
            });
        });
    }
};

// 导出Query类,供server.js引入使用
module.exports = Query;

2. 修改server.js:用async/await处理异步逻辑

调整代码顺序,用异步函数包裹操作,确保等待查询完成后再调用addRole:

const Query = require('./query.js'); // 引入Query类

// 先定义addRole函数,避免调用时未定义
const addRole = (departments) => {
  console.log(departments);
};

// 用async函数处理异步流程
async function init() {
  const getDepartmentsQuery = new Query();
  try {
    // await等待getDepartment的Promise完成,拿到查询结果
    const departments = await getDepartmentsQuery.getDepartment();
    addRole(departments);
  } catch (err) {
    // 捕获查询过程中的错误,避免程序崩溃
    console.error('获取部门数据失败:', err);
  }
}

// 执行初始化逻辑
init();

关键说明

  • async/await必须配合Promise使用,因此将回调式的db.query包装成Promise是解决异步顺序问题的核心。
  • 所有依赖异步结果的操作都要放在await之后,确保执行顺序符合预期。
  • 必须捕获异步操作的错误,避免未处理的异常导致程序终止。

内容的提问来源于stack exchange,提问作者Frances Cortuna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:15:39