NodeJS使用mysql包时,如何等待MySQL查询结果后再返回?
问题
开发NodeJS应用时需要查询两个不同的MySQL数据库,遇到了异步特性导致的问题——数据库查询还没返回结果,后续代码就已经执行了。使用mysql包连接数据库,当前查询能正确获取数据,但返回时机滞后。
数据库连接代码:
var mysql = require('mysql'); var connection_dblink = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'carritos_lead_ac_test' }); connection_dblink.connect(function (error) { if (error) { console.log('conexion dblink --> N O T O K <-- '); throw error; } else { console.log('conexion dblink OK'); } })
存在问题的getContact函数:
async function getContact(contact) { let responseGetContactFunc = connection_dblink.query(`SELECT * FROM contacto WHERE rut = \"${contact.rut}\";`, function (err, result, fields) { if (err) { console.log("ERROR"); throw err; } else { return result[0]; } }); console.log(responseGetContactFunc._ended); }
其中return result[0];是需要等待的返回值,但console.log(responseGetContactFunc._ended);返回false,说明查询尚未完成,想知道如何用await让函数在查询完成后再返回。
解决方案
1. 回调转Promise实现await等待
mysql包的query方法默认基于回调实现,要使用await,需要先把它包装成Promise:
async function getContact(contact) { // 将query操作包装为Promise const queryPromise = new Promise((resolve, reject) => { connection_dblink.query(`SELECT * FROM contacto WHERE rut = "${contact.rut}";`, (err, result, fields) => { if (err) { console.log("ERROR"); reject(err); // 错误时抛出异常 } else { resolve(result[0]); // 成功时返回目标结果 } }); }); // 用await等待查询完成 const contactResult = await queryPromise; console.log(connection_dblink._ended); // 此时查询已完成,返回true return contactResult; // 返回最终结果 }
2. 修复SQL注入风险
当前直接拼接参数到SQL语句的写法存在严重的SQL注入风险,建议改用参数化查询:
async function getContact(contact) { const queryPromise = new Promise((resolve, reject) => { // 用?作为参数占位符,第二个参数传入参数数组自动替换 connection_dblink.query('SELECT * FROM contacto WHERE rut = ?;', [contact.rut], (err, result, fields) => { if (err) { console.log("ERROR"); reject(err); } else { resolve(result[0]); } }); }); const contactResult = await queryPromise; return contactResult; }
3. 多数据库连接处理
如果需要查询两个不同的数据库,只需为每个数据库创建独立的连接实例,重复上述Promise包装逻辑即可,不同连接的异步操作互不影响。
内容的提问来源于stack exchange,提问作者Motias
相关产品推荐
相关产品推荐

