Nest抛出异常时如何将ExceptionsHandler错误信息作为API响应消息
Nest 框架返回非HttpException详细错误的实现方式
Nest 默认对非 HttpException 类型的异常做了环境差异化处理:
- 非生产环境:响应会自动携带详细错误信息、错误堆栈
- 生产环境:为避免敏感信息泄露,统一返回固定的
{"statusCode":500,"message":"Internal server error"}响应,详细错误仅输出到服务端日志
如果需要自定义错误返回逻辑(比如生产环境也返回指定的错误详情、统一错误响应结构),最规范的方式是实现全局异常过滤器,替换内置的异常处理逻辑,步骤如下:
1. 编写全局异常过滤器
新建 all-exceptions.filter.ts 文件,代码如下:
import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } from '@nestjs/common'; import { Request, Response } from 'express'; // 捕获所有类型的抛出异常 @Catch() export class AllExceptionsFilter implements ExceptionFilter { catch(exception: unknown, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse<Response>(); const request = ctx.getRequest<Request>(); // 区分HttpException和其他异常,取对应状态码 const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; // 提取错误详情:非HttpException直接取Error实例的message属性,就是服务端日志中打印的描述性错误信息 const exceptionRes = exception instanceof HttpException ? exception.getResponse() : { statusCode: status, message: (exception as Error).message, // 如需返回错误堆栈可打开下方注释,生产环境不建议开启 // stack: (exception as Error).stack }; // 组装响应返回给客户端 response.status(status).json({ ...(typeof exceptionRes === 'string' ? { message: exceptionRes } : exceptionRes), timestamp: new Date().toISOString(), path: request.url, }); } }
如果你的Nest应用使用Fastify作为底层HTTP框架,只需要把上面引入的Request/Response类型替换为Fastify对应的类型,接口逻辑不需要改动。
2. 全局注册过滤器
在应用入口main.ts中注册自定义过滤器,使其对所有接口生效:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { AllExceptionsFilter } from './all-exceptions.filter'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 注册全局异常过滤器 app.useGlobalFilters(new AllExceptionsFilter()); await app.listen(3000); } bootstrap();
注意:生产环境直接透传原始错误信息、错误堆栈存在安全风险,可能泄露数据库表结构、服务端部署路径、内部依赖逻辑等敏感信息,建议仅在开发环境开启全量错误透传,生产环境对未知系统错误保留通用提示,只对可控的业务类错误返回自定义详细提示。
内容的提问来源于stack exchange,提问作者Sean Ghaeli
相关产品推荐
相关产品推荐

