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

