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

Node.js使用mysqljs库执行select查询结果无法存入变量问题

问题根因

你遇到的问题是由Node.js异步执行逻辑导致的,具体原因有两个:

  • mysqljs的query方法默认采用回调模式异步执行,你在回调函数中写的return res只会将结果返回给回调函数本身,无法传递到外层select函数的作用域
  • dbConnection.query的直接返回值本身就是数据库连接实例对象,不是SQL执行结果,所以你直接返回这个值只能拿到连接信息

最优解决方案(Promise + async/await)

这是当前Node.js异步场景下最易用的写法,修改代码如下:

1. 改造dao.ts中的select函数

将查询逻辑封装为Promise返回:

export const select = (statement: string, dbConnection: any): Promise<any> => {
  return new Promise((resolve, reject) => {
    dbConnection.query(statement, function (err, res, fields) {
      if (err) return reject(err);
      resolve(res);
    });
  });
}

2. 改造main.ts中的调用逻辑

调用时用await关键字等待异步结果返回,注意await必须在被async修饰的函数内部使用:

// 示例:如果是在入口函数调用,先给函数加上async修饰
async function main() {
  const vehiclesDB = await select('SELECT * FROM vehicles', con);
  console.log(vehiclesDB);
}
main();

备选方案(回调模式)

如果你不想用Promise,也可以直接通过传递回调函数拿结果:

1. 改造dao.ts中的select函数

export const select = (statement: string, dbConnection: any, callback: (err: Error | null, result?: any) => void) => {
  dbConnection.query(statement, function (err, res, fields) {
    if (err) return callback(err);
    callback(null, res);
  });
}

2. 改造main.ts中的调用逻辑

select('SELECT * FROM vehicles', con, (err, res) => {
  if (err) throw err;
  const vehiclesDB = res;
  console.log(vehiclesDB);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:45:02