Node.js async函数操作mariadb抛出异常未被外层catch捕获问题
问题原因
- 核心错误来自
finally代码块的return conn.end()写法:按照JavaScript语法规则,finally块的return语句会覆盖整个函数的返回结果,catch块中抛出的异常会被直接忽略,最终外层接收到的是conn.end()返回的成功状态Promise,因此会进入then逻辑而非catch逻辑。 - 额外优化提示:原代码将
conn声明为全局变量,存在并发调用时连接对象被覆盖的风险,建议将conn声明移到函数内部。
修复代码
const mariadb = require('mariadb'); const pool = mariadb.createPool({ // 原有配置保持不变 }); async function getRegisterInfo(token){ let conn = null; // conn移到函数内部,避免并发冲突 try { conn = await pool.getConnection(); const rows = await conn.query('SELECT * FROM users_pending WHERE token = ?;', [token]); if(rows.length == 0) throw 404; return rows[0]; } catch (err) { console.log(err) throw err; } finally { if (conn) conn.end(); // 移除return,仅执行关闭连接操作 } } var token = "dzdz" getRegisterInfo(token).then(data=>{ console.log("Data:"+data) }).catch((err)=>{ console.log("Error:"+err) })
修复后输出
# node test.js 404 Error:404
符合预期效果。
内容的提问来源于stack exchange,提问作者Thefirstalpha
相关产品推荐
相关产品推荐

