14 NestJS 生产级错误过滤方案
前言:为什么需要生产级错误过滤
默认响应的局限
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 错误判断工具函数此处内容已隐藏回复后方可阅读。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据