Node.js中promise执行报错,如何将conn.query回调写法改为promise连接形式
解决方案
报错原因
你当前混用了回调风格和await异步写法:回调形式的conn.query本身返回值不是Promise,无法直接被await解析,因此触发报错。
改造方案
方案1:使用数据库驱动内置的Promise API(推荐)
如果你使用的是mysql2库,直接切换为Promise版本的导入即可,无需额外封装:
// 导入时替换为mysql2的promise版本 const mysql = require('mysql2/promise'); // 调用时无需传入回调,直接await获取结果,用try...catch捕获错误 try { // query返回数组第一位为查询结果,第二位为字段元信息,可按需解构 const [results] = await conn.query("SELECT ID, idle_timer, action, combat FROM users WHERE idle_timer >= 1 ORDER BY ID ASC"); // 此处编写查询结果处理逻辑 } catch (err) { // 此处编写错误处理逻辑,替代原回调的err参数处理 console.error('查询执行失败:', err); }
方案2:手动封装回调方法为Promise
如果使用的是不支持内置Promise的旧版本驱动,可以用Node.js内置的util.promisify工具转换:
const { promisify } = require('util'); // 将回调风格的query方法转为返回Promise的方法,绑定conn上下文避免this指向错误 const query = promisify(conn.query).bind(conn); // 使用逻辑和方案1一致 try { const results = await query("SELECT ID, idle_timer, action, combat FROM users WHERE idle_timer >= 1 ORDER BY ID ASC"); // 处理查询结果 } catch (err) { // 处理错误 }
注意事项
await语句必须写在被async关键字标记的函数内部,否则会触发语法错误- 不要同时传入回调函数和使用
await,二选一即可 - Promise模式下所有运行时错误都会走
catch分支,原回调的错误处理逻辑可以迁移到此处
内容的提问来源于stack exchange,提问作者jQuery
相关产品推荐
相关产品推荐

