Node.js中如何通过async/await从MySQL异步函数返回结果
解决MySQL query异步查询async/await返回结果问题
你的问题根源在于:当给MySQL的query方法传入回调函数时,它不会返回Promise对象,而是直接返回数据库连接实例。所以你用await根本等不到查询结果,拿到的自然是连接对象的方法和事件列表。
下面给你两种可行的async/await实现方案:
方案1:手动将query包装为Promise
这种方式不需要更换MySQL库,直接把回调式的调用转化为Promise:
export const IsEmailExistRepo = async (email) => { const selectEmailQuery = "SELECT email FROM users WHERE email=?"; // 用Promise包装query操作 const queryResult = await new Promise((resolve, reject) => { db_connect().query(selectEmailQuery, [email], (err, data) => { if (err) { reject(err); // 出错时抛出错误 } else { resolve(data); // 成功时返回查询数据 } }); }); return queryResult; };
方案2:使用mysql2的Promise版本(更推荐)
原生mysql库对Promise的支持不够友好,换用mysql2的Promise分支会更简洁:
- 先安装依赖:
npm install mysql2
- 修改你的数据库连接文件(比如
db_connect.js):
import mysql from 'mysql2/promise'; // 创建连接池(比单次连接更高效) const pool = mysql.createPool({ host: '你的数据库主机地址', user: '数据库用户名', password: '数据库密码', database: '目标数据库名', connectionLimit: 10 // 连接池最大连接数 }); export const db_connect = () => pool;
- 改写
IsEmailExistRepo函数:
export const IsEmailExistRepo = async (email) => { const pool = db_connect(); // await直接拿到查询结果,解构出数据行 const [rows] = await pool.query("SELECT email FROM users WHERE email=?", [email]); return rows; };
这样调用IsEmailExistRepo时,就能通过async/await正确获取到数据库查询返回的邮箱数据了。
内容的提问来源于stack exchange,提问作者Aditya Prakash
相关产品推荐
相关产品推荐

