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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:03:28