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

Express中间件:添加Promise拒绝处理程序简化错误捕获

嘿,我懂你想简化这个Express中间件错误处理的需求——用async/await搭配try/catch,或者封装一个通用的错误捕获高阶函数,都是非常清爽的解决方案,能让代码更简洁易读,还能统一处理错误。

方案一:直接用async/await + try/catch改造

把你的路由处理函数改成async函数,用try包裹业务逻辑,所有Promise的错误都会被catch捕获并直接传给Express的错误处理中间件:

router.put('/', async function (req, res, next) {
  try {
    const data = req.body;
    const q = req.parsedFilterParam;
    const opts = req.parsedQueryOpts;
    
    // 用await替代Promise链式调用,同步风格更直观
    const updateResult = await ResponseCtrl.update(q, data, opts);
    // 原代码里的stdPromiseResp(res)应该是返回一个接收结果的处理函数,所以这里把结果传进去
    stdPromiseResp(res)(updateResult);
  } catch (err) {
    // 把错误交给Express的全局错误处理中间件处理
    next(err);
  }
});

这种方式把原来的Promise链式调用改成了同步风格的代码,错误捕获逻辑一目了然,适合单个路由的快速改造。

方案二:封装通用高阶函数,批量简化路由错误处理

如果你的项目里有大量类似的路由中间件,不想每个都写try/catch,可以封装一个asyncHandler高阶函数,统一处理异步错误:

// 全局定义这个错误捕获高阶函数
const asyncHandler = (handler) => (req, res, next) => {
  // 自动捕获async函数的Promise错误,并传给next
  Promise.resolve(handler(req, res, next)).catch(next);
};

// 用它包裹你的路由处理函数
router.put('/', asyncHandler(async (req, res) => {
  const data = req.body;
  const q = req.parsedFilterParam;
  const opts = req.parsedQueryOpts;
  
  const updateResult = await ResponseCtrl.update(q, data, opts);
  stdPromiseResp(res)(updateResult);
}));

这个asyncHandler帮你省去了重复写try/catch的麻烦,所有异步操作的错误都会被自动捕获并传递给Express的全局错误处理中间件,让你的路由代码更干净。

注意事项

要确保你的Express应用已经配置了全局错误处理中间件(一个带有4个参数的函数),比如:

app.use((err, req, res, next) => {
  console.error('路由错误:', err);
  res.status(err.statusCode || 500).json({
    message: err.message || '服务器内部错误'
  });
});

这样next(err)传递的错误才能被正确处理并返回给客户端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:47:52