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 { }
相关文章
|
IDE 数据可视化 Linux
【matplotlib】plt.show() !真没这么简单!
【matplotlib】plt.show() !真没这么简单!
2715 1
|
Python Windows
Win10安装Python3.9
Win10安装Python3.9
2610 0
|
前端开发 应用服务中间件 Linux
使用Nginx搭建静态网站
使用Nginx搭建静态网站
3024 0
使用Nginx搭建静态网站
|
11月前
|
机器学习/深度学习 编解码 算法
空间转录组: 反卷积
空间转录组: 反卷积
空间转录组:  反卷积
Nest.js 实战 (一):使用过滤器优雅地统一处理响应体
这篇文章介绍了在Nest.js中如何处理接口统一返回格式的方法。首先定义了响应状态码枚举和类型,然后创建了HttpException异常过滤器来捕获HttpException类的异常并设置自定义响应逻辑。最后通过全局配置和效果预览展示了如何应用这些设置。
688 0
Nest.js 实战 (一):使用过滤器优雅地统一处理响应体
|
Cloud Native 安全 自动驾驶
全新升级!《云原生架构白皮书 2022 版》重磅发布
今年,《云原生架构白皮书2022版》正式上线,相较于2020年版本,本次内容新增数十家企业实战经验合集,同时在云原生产品矩阵中,新增多个核心产品家族,如容器产品家族、微服务产品家族、云原生技术中台 CNStack 产品家族等,更加一站式助力企业数字化转型。
9680 1
全新升级!《云原生架构白皮书 2022 版》重磅发布
|
前端开发 机器人 UED
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
|
传感器 物联网
LoRaWAN设备接入阿里云IoT企业物联网平台实战
LoRaWAN设备接入阿里云IoT企业物联网平台实战
2176 15
|
Cloud Native
带你读《云原生架构白皮书2022新版》——为什么需要云原生架构?
带你读《云原生架构白皮书2022新版》——为什么需要云原生架构?
348 47
|
监控 数据可视化 安全
Axure智慧社区数据可视化大屏模板
在数字化时代,智慧社区的建设成为提升居民生活质量和优化管理效率的重要手段。我们推出Axure智慧社区数据可视化大屏模板(含5套),帮助社区管理者快速搭建高效、美观的大屏,实现数据的实时监控和智能分析。模板设计多样、高度可定制,支持实时数据更新,适用于社区管理中心、物业管理处、社区活动中心和安防监控室等多种场景。立即下载,开启智慧社区新篇章!
937 0

热门文章

最新文章