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
相关产品推荐
相关产品推荐

