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

Express同步代码报错致服务器退出:原因排查与阻止方法

问题解答

你的问题核心在于路由处理函数是async函数,这和Express文档里的普通同步函数场景完全不同。

为什么服务器会崩溃?

Express确实能捕获普通同步路由/中间件里抛出的错误,但async函数里抛出的错误本质是Promise的rejection,而非同步抛出的错误。Express默认不会自动处理未捕获的Promise rejection,而Node.js对于未处理的Promise rejection,默认行为就是终止进程(输出调用栈后退出,返回Process exited with code 1),这就是你看到服务器崩溃的原因。

正确的处理方式

要让Express处理async函数里的错误,你需要手动把错误传递给next():

  1. 用try/catch包裹逻辑,捕获错误后传给next
app.get('/', async (req, res, next) => {
  try {
    throw new Error('BROKEN');
  } catch (err) {
    next(err); // 交给Express的错误处理机制
  }
});
  1. 或者利用Promise的catch方法,直接把错误传给next
app.get('/', (req, res, next) => {
  (async () => {
    throw new Error('BROKEN');
  })().catch(next);
});

你也可以封装一个通用工具函数,自动处理async路由的错误,避免每个路由都重复写try/catch:

const asyncHandler = (fn) => (req, res, next) => {
  Promise.resolve(fn(req, res, next)).catch(next);
};

// 使用方式
app.get('/', asyncHandler(async (req, res) => {
  throw new Error('BROKEN');
}));

补充说明

Express的错误处理规则里明确提到:async函数中抛出的错误需要手动传递给next,因为Express无法自动捕获Promise的rejection。你之前看到的文档示例是普通同步函数的场景,和你的async函数场景不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:27:41