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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:01:46