TMDOG的微服务之路_04——Nest.js 的异常筛选器

TMDOG的微服务之路_04——Nest.js 的异常筛选器

博客地址:TMDOG的博客

在上一篇博客中,我们实现了一个简易的用户管理 API 并添加了中间件功能。本篇博客,我们将探讨如何在 Nest.js 中使用异常筛选器。可以帮助我们更好地处理异常。

异常筛选器

1. 创建异常筛选器

异常筛选器用于捕获和处理应用程序中的HTTP异常。在 src\common\filter 下创建一个异常筛选器 http-exception.filter.ts

import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();
    const exceptionResponse = exception.getResponse();
    
    const errorResponse = {
      statusCode: status,
      timestamp: new Date().toLocaleString(),
      path: request.originalUrl,
      message: exceptionResponse['message'] || exception.message,
    };

    response.status(status).json(errorResponse);
  }
}
解释
  • ExceptionFilter, Catch, ArgumentsHost, HttpException:从 @nestjs/common 导入,分别用于定义异常过滤器、捕获特定类型异常的装饰器、获取当前处理上下文和表示 HTTP 异常。
  • @Catch(HttpException):这是一个装饰器,用于捕获 HttpException 类型的异常。
  • HttpExceptionFilter 实现了 ExceptionFilter 接口。
  • catch 方法是 ExceptionFilter 接口必须实现的方法。它接收一个 HttpException 对象和一个 ArgumentsHost 对象。
  • ctx:从 ArgumentsHost 中获取 HTTP 上下文。
  • responserequest:分别获取 ResponseRequest 对象。
  • status:获取异常的状态码。
  • exceptionResponse:获取异常的响应信息。
  • errorResponse:构造一个包含状态码、时间戳、请求路径和错误信息的对象。
  • 使用 response 对象将 errorResponse 以 JSON 格式发送给客户端。

2. 全局挂载异常筛选器

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './common/filter/http-exception.filter';
require('dotenv').config();

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(3000);
}
bootstrap();
  • 我们将异常筛选器挂载到全局app.useGlobalFilters(new HttpExceptionFilter());

3. 修改controller

@Post('register')
  register(@Req() req: Request, @Res() res: Response) {
    const { username, password } = req.body;
    try {
      const result = this.userService.register(username, password);
      res.status(HttpStatus.CREATED).send({ result, massage: '注册成功' });
    } catch (e) {
      throw new HttpException(e.message, HttpStatus.UNAUTHORIZED);
    }
  }
  • 在我们之前的代码基础上规范化了register的响应并使用HttpException抛出异常

4.运行效果

正常请求:
请添加图片描述

然后我们再次注册:

请添加图片描述
我们发现响应了异常

然后我们注释掉挂载的异常筛选器,再次同样的操作

我们发现只响应了HttpException的内容
请添加图片描述

结论

通过以上步骤,我们成功地在 Nest.js 应用中添加并使用了异常筛选器。在处理异常时起到了统一对外响应不同的异常的作用。希望这篇博客能帮助你更好地理解和使用 Nest.js 中的异常筛选器。

在下一个博客中,我们将进一步探讨 Nest.js 的其他功能,敬请期待。

如果各位技术大佬有任何问题或建议,欢迎在评论区留言。

感谢阅读!

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值