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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:57:01