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库
- 先安装mysql2:
npm install mysql2
- 修改数据库连接与
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
相关产品推荐
相关产品推荐

