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

Node.js从MySQL取数据跨模块调用返回Query对象问题求助

问题原因

你在getUser方法里同时混用了async/await和回调函数,导致await拿到的不是查询结果,而是MySQL的Query实例。

MySQL原生模块的query方法有两种调用逻辑:

  • 传入回调函数时,方法不会返回Promise,直接返回Query对象,回调里的返回值无法被外部获取
  • 不传入回调函数时,原生模块对Promise的支持不完善,无法直接通过await拿到结果
解决方案

方案1:将回调逻辑包装为Promise

修改getUser方法,手动把query的回调逻辑封装成Promise:

class User {
  constructor() {}
  static async getUser(email: string) {
    return new Promise((resolve, reject) => {
      DataBase.query("SELECT * FROM childcare.user where email =?", [email], (err, result) => {
        if (err) reject(err);
        else resolve(result);
      });
    });
  }
}
module.exports = User;

方案2:使用支持Promise的mysql2库

  1. 先安装mysql2:
npm install mysql2
  1. 修改数据库连接与getUser方法(假设DataBase是用mysql2创建的连接池/连接):
const mysql = require('mysql2/promise');

// 示例创建连接池
const DataBase = mysql.createPool({
  host: '你的数据库地址',
  user: '用户名',
  password: '密码',
  database: 'childcare'
});

class User {
  constructor() {}
  static async getUser(email: string) {
    // query返回数组,第一个元素是查询结果
    const [result] = await DataBase.query("SELECT * FROM childcare.user where email =?", [email]);
    return result;
  }
}
module.exports = User;
验证修改

修改后你的login方法无需改动,就能正常获取到用户数据:

const userModule = require("../../modules/user");
static async login(req: Request, res: Response) {
    const { email, password } = req.body;
    const user = await userModule.getUser(email);
    console.log('user is ', user); // 现在会输出查询到的用户对象
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:03:28