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 前端开发 Linux
Node.js 获取文件信息及路径
Node.js 获取文件信息及路径
|
Python Windows
Win10安装Python3.9
Win10安装Python3.9
2255 0
|
5月前
|
机器学习/深度学习 编解码 算法
空间转录组: 反卷积
空间转录组: 反卷积
空间转录组:  反卷积
Nest.js 实战 (一):使用过滤器优雅地统一处理响应体
这篇文章介绍了在Nest.js中如何处理接口统一返回格式的方法。首先定义了响应状态码枚举和类型,然后创建了HttpException异常过滤器来捕获HttpException类的异常并设置自定义响应逻辑。最后通过全局配置和效果预览展示了如何应用这些设置。
590 0
Nest.js 实战 (一):使用过滤器优雅地统一处理响应体
|
前端开发 机器人 UED
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
|
安全 Java API
基于Spring Boot REST API设计指南
【10月更文挑战第10天】 在现代Web应用开发中,RESTful API扮演着至关重要的角色。Spring Boot作为一个高效、便捷的Java开发框架,为构建RESTful API提供了强大的支持。本文将分享基于Spring Boot的REST API设计指南,涵盖从项目初始化到API文档配置的全过程。
367 0
|
Cloud Native
带你读《云原生架构白皮书2022新版》——为什么需要云原生架构?
带你读《云原生架构白皮书2022新版》——为什么需要云原生架构?
287 47
|
前端开发 JavaScript 关系型数据库
typeorm连表查没有关联关系的实体
typeorm连表查没有关联关系的实体
365 1
|
机器学习/深度学习
交通流量预测LSTM实战 详细教学计算机毕设
交通流量预测LSTM实战 详细教学计算机毕设
521 0
|
存储 SQL 数据库连接
数据输入输出概念详解与代码示例
在编程领域,数据的输入与输出是极为关键的环节,它们构成了程序与外界交互的桥梁。数据的输入是指程序从外部获取数据的过程,而数据的输出则是程序将处理后的数据展现给外部用户或系统的过程。了解并掌握数据输入输出的概念对于编写高效、实用的程序至关重要。
502 0

热门文章

最新文章