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

Node.js使用MySQL连接池封装查询函数返回结果为空问题求解

问题原因
  • 你混用了回调异步逻辑和async/await同步语法,getConnection和query的回调函数执行时机晚于函数的return语句,所以返回的时候patient还没被赋值,自然是空值。
  • 你使用的promise-mysql库本身所有API都支持Promise调用,不需要写回调嵌套逻辑,直接用await即可,还能避免回调地狱。
修复后的实现代码

1. 连接池初始化

const mysql = require('promise-mysql');
// 初始化连接池,createPool直接返回池实例不需要await
const pool = mysql.createPool({
    host: dotenv.parsed.DB_HOST,
    user: dotenv.parsed.DB_LOGIN,
    password: dotenv.parsed.DB_PASSWORD,
    database: dotenv.parsed.DB_NAME,
    charset: dotenv.parsed.DB_CHAR,
    multipleStatements: dotenv.parsed.DB_MULTI
});
// 进程退出时关闭连接池
process.on('exit', () => { pool.end() });

2. 封装公共查询函数(避免重复代码)

/**
 * @description 公共SQL查询方法
 * @param {string} sql 要执行的SQL语句,支持?占位符
 * @param {Array} params 占位符对应的参数数组
 * @returns {Promise<Array>} 查询结果
 */
async function query(sql, params) {
    let connection;
    try {
        // 从连接池获取连接
        connection = await pool.getConnection();
        // 执行查询
        const result = await connection.query(sql, params);
        return result;
    } catch (err) {
        console.error('SQL执行错误:', err);
        throw err;
    } finally {
        // 无论执行成功失败都释放连接回连接池
        if (connection) connection.release();
    }
}

3. 业务查询函数示例(直接复用公共query方法)

/**
* @description 获取用户的身份证号和密码
* @param {string} personnummer 瑞典政府发放的个人身份证号
* @returns {Promise<Array>} 匹配的患者信息
*/
async function getPat(personnummer) {
    const sql = "SELECT * FROM patients where personnummer=?";
    return await query(sql, [personnummer]);
}
额外说明
  • 连接池会自动管理连接的创建、复用、销毁,不需要手动维护长连接,天然解决之前的连接超时问题。
  • 公共query方法统一做了异常捕获和连接释放,所有业务查询都可以直接复用,不需要每个方法都重复写获取连接、释放连接的逻辑。
  • 调用getPat的时候需要用await或者.then()拿结果,因为异步函数返回的是Promise。

内容的提问来源于stack exchange,提问作者Abdulrahman Sakah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:27:03