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

Express+TypeScript异步错误未返回响应,服务崩溃

Express+TypeScript异步路由错误无法被中间件捕获的解决方案

问题场景

使用Node.js+Express+TypeScript开发时,带async关键字的控制器方法抛出错误(如UnauthorizedError)时,错误无法被自定义错误处理中间件捕获,直接导致服务崩溃;但同步路由的错误能正常被中间件处理并返回响应。已尝试引入express-async-errors但未生效。

核心原因

  1. express-async-errors拼写错误:原代码中引入的是express-async-error(缺少末尾的s),导致库未正确加载。
  2. 库引入顺序错误:express-async-errors需要在所有路由、控制器定义前引入,否则无法包装Express的异步路由处理逻辑。
  3. 错误中间件挂载顺序错误:错误处理中间件必须在所有路由注册完成后挂载,才能捕获后续路由抛出的错误。

解决步骤

1. 修正express-async-errors的引入语句

确保引入正确的库名称:

// 正确引入,注意末尾的s
import 'express-async-errors';

2. 调整库的引入顺序

将express-async-errors放在所有路由、控制器相关代码之前引入,保证Express能提前包装异步路由的错误处理:

// 第一步:先引入express-async-errors
import 'express-async-errors';
// 第二步:再引入其他依赖
import { app } from './app';
import dotenv from 'dotenv';
import { AppDataSource } from './database/data-source';
import errorHandlerMiddleware from './app/middlewares/errorHandlerMiddleware';

dotenv.config();

3. 确认错误中间件的挂载位置

确保错误处理中间件在所有路由注册完成后挂载。如果你的app实例(./app导出)已经完成了路由注册,当前server.ts中的挂载位置是正确的:

AppDataSource.initialize().then(async () => {
  console.log('database is running');
  // 确保所有路由已注册,再挂载错误中间件
  app.use(errorHandlerMiddleware);
  app.listen(port, () => {
    console.log(`server is running in  http://localhost:${port}`);
  });
});

4. 验证修复效果

测试无效邮箱/密码的场景,此时错误会被中间件捕获,返回如下JSON响应,服务不会崩溃:

{
  "message": "Invalid credentials"
}

补充说明

Express原生无法自动捕获异步路由中抛出的错误,express-async-errors的作用是重写Express的路由处理逻辑,自动将异步函数的错误传递给next(),让错误处理中间件能够捕获并处理。只有当库被正确引入且顺序正确时,才能生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:33:15