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

Node.js使用mysql包时如何将查询结果导出到函数外供后续使用

问题根因

mysql包的query方法是异步执行的,代码执行到查询语句时不会阻塞等待数据库返回结果,会直接向下执行后续的res.write逻辑。此时回调函数还没有被触发,output变量还没有被赋值,所以返回undefined。

可行解决方案

方案1:将业务逻辑放入回调内

所有依赖查询结果的逻辑都直接写在回调函数中,保证逻辑执行顺序正确:

dba.query('SELECT * FROM `movies-web`.movies;',(err, rows) => {
    if(err) {
        throw err;
    }
    // 此处rows就是查询结果,直接处理业务逻辑
    res.write(JSON.stringify(rows));
    res.end();
});

方案2:Promise封装+async/await语法(推荐)

如果业务逻辑层级多,为了避免回调地狱,可以把查询方法封装为Promise,用async/await语法写同步风格的异步代码:

  1. 首先封装查询方法
function queryAsync(sql) {
  return new Promise((resolve, reject) => {
    dba.query(sql, (err, rows) => {
      if (err) return reject(err);
      resolve(rows);
    })
  })
}
  1. 在业务逻辑中调用
// 注意外层的业务函数必须添加async修饰符
async function handleRequest() {
  try {
    const output = await queryAsync('SELECT * FROM `movies-web`.movies;');
    res.write(JSON.stringify(output));
    res.end();
  } catch (err) {
    throw err;
  }
}
注意事项
  • 数组类型的查询结果不能直接传给res.write,需要用JSON.stringify转为字符串格式后再输出
  • 所有依赖异步查询结果的逻辑,必须保证在查询完成后触发,不能放在异步逻辑外同步执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:09:04