Express中如何使用Promise嵌套MySQL查询 解决pool.query无then方法报错
核心问题原因
- 你使用的数据库连接池
pool默认的query方法是回调风格API,不支持Promise链式调用的then方法,所以第一次报错then is not a function - 你手动包裹Promise的写法没有正确处理回调结果,也没有调用
resolve/reject,同时catch的参数写法错误,直接传入了console.log()的执行结果,导致无论是否出错都会提前打印报错信息 - 你在Promise.all的回调中错误调用了
result.status(),result是所有异步任务的返回结果数组,不是接口响应对象res
修复步骤
第一步:Promise化query方法
可以用Node.js内置的util.promisify把回调风格的query转成Promise风格,无需更换依赖:
const pool = require("../../config/database"); const { promisify } = require('util'); // 把query转成Promise风格 const query = promisify(pool.query).bind(pool);
如果你用的是mysql2,也可以直接引入promise版本的连接池:const pool = require('mysql2/promise').createPool(你的数据库配置)
第二步:优化代码写法
用async/await语法替代嵌套的then链式调用,可读性更高,也更容易排查错误,同时修正所有语法问题。
修复后完整代码
const pool = require("../../config/database"); const { promisify } = require('util'); const query = promisify(pool.query).bind(pool); module.exports = { seedTypeChecker: async (req, res) => { try { // 执行第一个查询 const rows = await query(` SELECT id FROM records WHERE type = 'SM1' and member_id NOT IN (SELECT member_id FROM cc_see) `); // 生成批量更新的Promise列表 const promiseList = rows.map(row => { return query(` UPDATE records set type = ?, see_issue = ? WHERE id NOT IN (SELECT id FROM clearer) AND id = ? `, ['SM1', '1', row.id]); }); // 等待所有更新完成 await Promise.all(promiseList); console.log("所有更新执行成功"); res.status(200).json({ success: 1, message: "Query was successful" }); } catch (err) { console.error("操作出错:", err); res.status(500).json({ success: 0, message: "Database Error" }); } } }
内容的提问来源于stack exchange,提问作者mCubes
相关产品推荐
相关产品推荐

