前言:为什么需要生产级错误过滤

默认响应的局限

NestJS 内置的异常处理机制已经相当完善,但在生产项目中仍然存在明显不足:

格式不统一:不同层抛出的异常,响应结构各不相同。HttpException 返回 { statusCode, message },未捕获的 Error 返回 500 的通用格式,Prisma 错误则直接泄露为 500 且没有任何业务上下文。

泄露内部细节:默认情况下,数据库错误、堆栈信息、内部路径等敏感内容可能出现在生产环境的响应体中。

可观测性差:没有统一的日志格式,无法关联请求链路,难以在监控系统中定位问题根源。

生产环境的核心诉求

诉求说明
统一格式前端对接时只需处理一种响应结构
安全隐藏内部细节生产环境不暴露数据库错误码、堆栈、文件路径
可观测性每条错误日志可追溯到具体请求
可维护性错误码集中管理,便于国际化和前端对接

本文方案概览

本文构建两层过滤器链路:

请求进入
   ↓
业务逻辑 / ORM 操作
   ↓ 抛出异常
PrismaExceptionFilter     ← 优先处理 Prisma 错误,非 Prisma 错误继续上抛
   ↓ 非 Prisma 错误
AllExceptionsFilter        ← 兜底处理所有其余异常(HttpException、业务异常、未知 Error)
   ↓
统一格式的 JSON 响应

涉及的文件结构:

src/
├── common/
│   ├── filters/
│   │   ├── all-exceptions.filter.ts        # 兜底过滤器
│   │   └── prisma-exception.filter.ts      # Prisma 专用过滤器
│   ├── exceptions/
│   │   ├── business.exception.ts           # 自定义业务异常基类
│   │   └── error-codes.ts                  # 统一错误码枚举
│   └── interfaces/
│       └── error-response.interface.ts     # 统一响应结构接口
└── database/
    └── utils/
        └── prisma-error.util.ts            # Prisma 错误判断工具函数

此处内容已隐藏回复后方可阅读。

分类: NestJS中级 标签: 过滤器Nestjs

评论

暂无评论数据

暂无评论数据

目录