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 { }
相关文章
|
JSON 前端开发 Java
springmvc-JSR303进行服务端校验&分组验证&SpringMVC定义Restfull接口&异常处理流程&RestController异常处理
springmvc-JSR303进行服务端校验&分组验证&SpringMVC定义Restfull接口&异常处理流程&RestController异常处理
|
4天前
|
前端开发 Java UED
SpringMVC全局异常处理+拦截器使用+参数校验
通过使用 SpringMVC 的全局异常处理、拦截器和参数校验,可以有效提升 Web 应用程序的安全性、稳定性和用户体验。这些技术的合理应用,不仅可以保证代码的健壮性,还能提高代码的可维护性,为开发高质量的 Web 应用程序提供了坚实的基础。
18 6
|
4月前
|
Java Spring
@Async注解导致循环依赖,BeanCurrentlyInCreationException异常
@Async注解导致循环依赖,BeanCurrentlyInCreationException异常
|
Java API Spring
【异常】Feign 调用api模块直接进入fallback的问题解决办法
【异常】Feign 调用api模块直接进入fallback的问题解决办法
359 0
|
JSON Java API
优雅地进行全局异常处理、统一返回值封装、自定义异常错误码——Graceful-Response推荐
Graceful Response是一个Spring Boot体系下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码等功能,使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。
347 0
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理
|
6月前
|
JSON Java 数据格式
SpringBoot - 错误处理机制与自定义错误处理实现
SpringBoot - 错误处理机制与自定义错误处理实现
50 0
|
11月前
|
JSON 前端开发 Java
SpringMVC中异常处理与ControllerAdvice捕捉全局异常
SpringMVC中异常处理与ControllerAdvice捕捉全局异常
92 0
Springboot 全局异常捕获以及统一接口返回结果
Springboot 全局异常捕获以及统一接口返回结果
297 0