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

mysql2 Promise客户端报错:无法使用回调函数的问题求助

错误原因与解决方法

错误原因

你的数据库连接池是Promise版本客户端(错误栈中的PromisePool.query可佐证),但你在loginPW函数中仍使用传统回调函数调用query方法,两种模式不兼容,因此触发该错误。

解决方法

方法1:改用Promise/Async-Await风格(推荐)

既然连接池是Promise客户端,需用Promise语法处理查询,而非回调。修改loginPW函数如下:

async loginPW() {
  try {
    // mysql2 Promise版query返回[结果集, 字段信息],解构取结果
    const [results] = await connection.query('SELECT card_pin FROM card');
    const cardPin = results[0].card_pin;
    return [cardPin];
  } catch (error) {
    throw error;
  }
}

在调用该函数的路由文件(如balance.js)中,需用async/await处理异步逻辑:

// balance.js中的路由处理示例
router.get('/balance', async (req, res) => {
  try {
    const loginArray = await loginPW();
    res.status(200).json(loginArray);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

方法2:切换为回调风格的连接池

若坚持使用回调模式,需修改database.js,创建非Promise版本的连接池:

const mysql = require('mysql2');
const dotenv = require('dotenv');
dotenv.config();
// 创建回调风格的连接池,避免使用Promise模式
const connection = mysql.createPool(process.env.MYSQL_SERVER);
module.exports = connection;

修改后,你原本的loginPW回调写法即可正常运行。

关于你之前尝试的说明

你之前移除回调改用res.status.json未解决问题,大概率是因为没有正确处理Promise的异步逻辑(比如未用await或.then()等待查询完成就直接返回响应),导致异步操作未完成就结束了请求。

内容的提问来源于stack exchange,提问作者Valtteri K.A.P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:03:12