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
2152 0
|
4月前
|
机器学习/深度学习 编解码 算法
空间转录组: 反卷积
空间转录组: 反卷积
空间转录组:  反卷积
|
前端开发 机器人 UED
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
OpenAI启动ChatGPT Projects,让你可以组织文件、分组聊天
WK
|
数据安全/隐私保护
QLineEdit
QLineEdit是Qt框架中的单行文本输入框控件,支持文本输入、占位符、密码模式、输入限制等功能。常用成员函数包括设置文本、占位符、显示模式、最大长度等。提供多种信号,如文本变化、编辑、回车等。支持添加动作和清除按钮,可定制样式,适用于登录、搜索等场景。
WK
510 0
|
边缘计算 安全 开发工具
探索未来计算的可能性:Wasmer — 高性能WebAssembly运行时
探索未来计算的可能性:Wasmer — 高性能WebAssembly运行时
561 2
【教程】加速访问和下载github项目,原来替换一个域名就可以加速了
【教程】加速访问和下载github项目,原来替换一个域名就可以加速了
|
Cloud Native
带你读《云原生架构白皮书2022新版》——为什么需要云原生架构?
带你读《云原生架构白皮书2022新版》——为什么需要云原生架构?
272 42
|
数据安全/隐私保护
Invalid Login Credentials
Invalid Login Credentials
330 0
|
机器学习/深度学习
交通流量预测LSTM实战 详细教学计算机毕设
交通流量预测LSTM实战 详细教学计算机毕设
496 0