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

Node.js MySQL操作中回调抛出错误无法被try catch捕获该如何处理

问题根本原因

你遇到的问题本质是异步回调中的错误无法被外层同步try/catch捕获:回调函数会在当前同步栈执行完毕后才触发执行,此时外层的try/catch上下文已经销毁,回调中抛出的错误会成为未捕获异常直接导致进程崩溃。

解决方案

方案1:直接在回调错误分支处理(改造成本最低)

直接在query的回调error分支完成错误响应,不需要抛出错误,不需要依赖外层try/catch:

router.post('/', (req, res) => {
  const category_name = "Books"
  const account_id = "6908vbb465789"
  connection.query(
    "INSERT INTO category(category_name,account_id) Values(?,?)",
    [category_name,account_id],
    function (error, results, fields) {
      if (error) {
        // 直接处理错误返回响应,不抛出
        return res.status(400).json(error);
      }
      res.send({
        code: 200              
      });
    });
})

方案2:封装为Promise使用async/await(错误管理更统一)

如果偏好统一用try/catch管理所有业务错误,可以将回调风格的查询方法封装为Promise,配合async/await语法使用,异步错误可以正常被try/catch捕获:

const util = require('util');
// 把callback风格的query转为返回Promise的方法
const query = util.promisify(connection.query).bind(connection);

router.post('/', async (req, res) => {
  try {
    const category_name = "Books"
    const account_id = "6908vbb465789"
    await query(
      "INSERT INTO category(category_name,account_id) Values(?,?)",
      [category_name,account_id]
    )
    res.send({
      code: 200              
    });
  } catch (e) {
    res.status(400).json(e);
  }
})

如果使用的是mysql2依赖,本身已经提供了Promise版本的接口,不需要手动封装,直接引入mysql2/promise即可使用。


内容的提问来源于stack exchange,提问作者Anjana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 06:09:03