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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:40:45