使用mysql2连接池实现通用查询函数时返回undefined问题
解决mysql2通用query函数返回undefined的问题
问题出在你的promise链最后一个then上:这个then返回的是connection.release()的执行结果(该方法无返回值,即undefined),覆盖了之前result[0]的返回值,导致最终db.query()返回的Promise resolve为undefined。
另外你的错误处理存在漏洞:catch里仅打印错误却未重新抛出,调用方无法感知数据库查询失败,只会得到undefined。
解决方案1:使用finally替代最后一个then
finally不会改变Promise的返回值,无论其中执行什么操作,Promise的结果都会保留之前的resolve/reject状态:
修改后的db.js代码:
const DataBase = require("mysql2"); const options = require('../options'); // 补全options引入,原代码遗漏该依赖 const pool = DataBase.createPool({ connectionLimit: 50, host: options.db_host, user: options.db_login, database: options.db_name, password: options.db_password }).promise(); module.exports.query = async function (sql) { const connection = await pool.getConnection(); return connection.query(sql) .then(result => { return result[0]; }) .catch(err => { console.error(err); throw err; // 重新抛出错误,让调用方可以捕获处理 }) .finally(() => { connection.release(); // 释放连接,不影响返回值 }); }
解决方案2:用async/await重构代码(更推荐)
抛弃Promise链,用try/catch/finally让逻辑更清晰直观:
const DataBase = require("mysql2"); const options = require('../options'); const pool = DataBase.createPool({ connectionLimit: 50, host: options.db_host, user: options.db_login, database: options.db_name, password: options.db_password }).promise(); module.exports.query = async function (sql) { const connection = await pool.getConnection(); try { // mysql2的query返回[结果集, 字段信息],直接解构获取结果 const [result] = await connection.query(sql); return result; } catch (err) { console.error(err); throw err; // 抛出错误给调用方处理 } finally { // 无论成功失败都确保释放连接 connection.release(); } }
修改后,app.js里的await db.query()就能正确拿到数据库查询结果。
内容的提问来源于stack exchange,提问作者Kate Kirienko
相关产品推荐
相关产品推荐

