Nestjs(五)异常处理方式(异常过滤器)

简介: Nestjs(五)异常处理方式(异常过滤器)

一、简介

$ nest g f http-exception
// 这是创建后的文件初始内容
import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common';
@Catch()
export class HttpExceptionFilter<T> implements ExceptionFilter {
  catch(exception: T, host: ArgumentsHost) {
    // 这里就是拦截到的异常,需要处理并抛出给到前台方便直观看到问题...
    // 输出拦截到的错误异常
    console.log(exception)
  }
}
  • 做下小改造,上面初始化的只会在 node 控制台输出,现在改造成将这个异常抛出到接口返回,前端接口就能看得到:
import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common';
// 如果不引用,可能会导致类型关联错误
import { Response, Request } from 'express';
// 捕获 HttpException 错误;  如果 @Catch() 里面没有参数, 则捕获所有错误
// 可以支持多个 @Catch(HttpException, xxx, xxx)
// 支持的内置异常列表文档:https://docs.nestjs.cn/10/exceptionfilters?id=%e5%86%85%e7%bd%aehttp%e5%bc%82%e5%b8%b8
@Catch(HttpException)
export class HttpExceptionFilter<T> implements ExceptionFilter {
  // exception:当前正在处理的异常对象
  // host:传递给原始处理程序的一个包装(Response/Request)引用参数
  catch(exception: HttpException, host: ArgumentsHost) {
    // 获取上下文
    const ctx = host.switchToHttp();
    // 响应对象,跟接口中 @Response @Res 取到的一样
    const response = ctx.getResponse<Response>();
    // 请求对象,跟接口中 @Request @Req 取到的一样
    const request = ctx.getRequest<Request>();
    // 异常状态
    const status = exception.getStatus();
    // 抛出错误日志
    response
      .status(status)
      .json({
        dzm: '测试字段',
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url
      });
  }
}

二、局部支持异常处理

  • 某个接口
import { Controller, Get, Body, Query, Post, Param, Request, Req, Res, Redirect, HttpCode, HttpException, HttpStatus, UseFilters } from '@nestjs/common';
import { UserService } from './user.service';
// 这里也需要引入
import { HttpExceptionFilter } from 'src/http-exception.filter';
@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) { }
  @Get('/dzm')
  // 添加上过滤器
  @UseFilters(new HttpExceptionFilter())
  getDzm(@Req() req: any, @Res() res: any): any {
    // 故意抛出异常进行测试
    throw new HttpException('Forbidden', HttpStatus.FORBIDDEN)
    res.send(req.query)
  }
}
  • 某个控制器下的所有接口
import { Controller, Get, Body, Query, Post, Param, Request, Req, Res, Redirect, HttpCode, HttpException, HttpStatus, UseFilters } from '@nestjs/common';
import { UserService } from './user.service';
import { HttpExceptionFilter } from 'src/http-exception.filter';
@Controller('user')
@UseFilters(new HttpExceptionFilter())
export class UserController {
  constructor(private readonly userService: UserService) { }
  @Get('/dzm')
  getDzm(@Req() req: any, @Res() res: any): any {
    // 故意抛出异常进行测试
    throw new HttpException('Forbidden', HttpStatus.FORBIDDEN)
    res.send(req.query)
  }
}

三、全局异常处理

  • 方式一:main.ts,无法注入依赖
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './http-exception.filter';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // 全局注册异常过滤器
  app.useGlobalFilters(new HttpExceptionFilter())
  await app.listen(3000);
}
bootstrap();
  • 方式二:app.module.ts,支持注入依赖
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { LoginModule } from './login/login.module';
import { APP_FILTER } from '@nestjs/core';
import { HttpExceptionFilter } from './http-exception.filter';
@Module({
  imports: [UserModule, LoginModule],
  controllers: [AppController],
  providers: [
    AppService,
    // 这样注册即可,效果一样,可以根据需要使用此技术添加任意数量的过滤器
    {
      provide: APP_FILTER,
      useClass: HttpExceptionFilter,
    },
  ],
})
export class AppModule { }
相关文章
|
JavaScript
vue element plus Badge 徽章
vue element plus Badge 徽章
223 0
|
JavaScript 前端开发 Linux
Node.js 获取文件信息及路径
Node.js 获取文件信息及路径
|
Python Windows
Win10安装Python3.9
Win10安装Python3.9
1985 0
|
安全 Java API
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档
这篇文章介绍了Swagger,它是一组开源工具,围绕OpenAPI规范帮助设计、构建、记录和使用RESTAPI。文章主要讨论了Swagger的主要工具,包括SwaggerEditor、SwaggerUI、SwaggerCodegen等。然后介绍了如何在Nest框架中集成Swagger,展示了安装依赖、定义DTO和控制器等步骤,以及如何使用Swagger装饰器。文章最后总结说,集成Swagger文档可以自动生成和维护API文档,规范API标准化和一致性,但会增加开发者工作量,需要保持注释和装饰器的准确性。
415 0
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档
|
SQL 运维 监控
Nest.js 实战 (十):使用 winston 打印和收集日志记录
这篇文章介绍了在Nest服务中如何使用Winston记录日志。文章首先强调了日志记录在后台服务中的重要性,接着提到Nest默认的内部日志记录器,并指出可以通过@nestjs/common包中的Logger类来全面控制日志系统的行为。文章还提到,为了在生产环境中实现更高级的日志功能,可以使用如Winston之类的Node.js日志包。接下来,文章介绍了如何在Nest服务中使用Winston记录日志,包括安装相关依赖、创建winston配置文件以及实现简单的日志记录示例。最后,文章指出更高级的自定义日志功能需要读者自己去探索。
484 0
Nest.js 实战 (十):使用 winston 打印和收集日志记录
|
10月前
|
前端开发 机器人 UED
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
|
12月前
|
安全 Java API
基于Spring Boot REST API设计指南
【10月更文挑战第10天】 在现代Web应用开发中,RESTful API扮演着至关重要的角色。Spring Boot作为一个高效、便捷的Java开发框架,为构建RESTful API提供了强大的支持。本文将分享基于Spring Boot的REST API设计指南,涵盖从项目初始化到API文档配置的全过程。
254 0
|
边缘计算 安全 开发工具
探索未来计算的可能性:Wasmer — 高性能WebAssembly运行时
探索未来计算的可能性:Wasmer — 高性能WebAssembly运行时
425 2
VSCode 自动修改闭合标签
VSCode 自动修改闭合标签
278 0
|
数据安全/隐私保护
Invalid Login Credentials
Invalid Login Credentials
293 0