首页 > 其他分享 >TMDOG的微服务之路_04——Nest.js 的异常筛选器

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

时间:2024-08-06 21:24:28浏览次数:9  
标签:const 04 HttpException 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 的其他功能,敬请期待。

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

感谢阅读!

标签:const,04,HttpException,Nest,js,筛选,异常
From: https://blog.csdn.net/m0_74139496/article/details/140966679

相关文章

  • jsoncpp库的简易引入教程
    1.打开github上项目的主页jsoncpp2.clone到本地gitclonehttps://github.com/open-source-parsers/jsoncpp.git3.生成jsoncpp库的头文件以及源文件进入项目目录![[Pastedimage20240510150641.png]]执行Python命令,pythonamalgamate.py![[Pastedimage20240510150......
  • SolidJS-forceDirectedGraph(2)
    使用solidJS实现力导向图力导向图参考:https://segmentfault.com/a/1190000016384506力算法代码:/***@desc力算法*/functionforce(data,ctx,size){const{nodes,links}=data;//需要参数constmaxInterval=300;//平衡位置间距cons......
  • 【CDQ分治】[P5094 [USACO04OPEN] MooFest G 加强版
    P5094[USACO04OPEN]MooFestG加强版-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;cin>>n;vecto......
  • 原生js与微信小程序 控制<video>标签 视频播放倍率
    最近公司小程序有个需求要求里面的视频可以让用户控制播放的倍率需求很简单但是要注意在不同终端上写法可能有些许区别这里大家主要关注js的部分原生jshtml部分<divid="box"><videoid="myVideo"style="width:100%;"controlssrc="https://cdrbonlinecour......
  • JS历理 foot.js的部分功能
    document.writeln("<divid=\'outerdiv\'style=\'position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;\'>");document.writeln("<divid=\'innerdiv\'s......
  • 编程深水区之并发②:JS的单线程事件循环机制
    如果某天有人问你,Node.js是单线程还是多线程,你如何回答?一、单线程并发原理我们以处理Web请求为例,来看看Node在处理并发请求时,究竟发生了什么。Node启动Web服务器后,创建主线程(只有一个)。当有一个阻塞请求过来时,主线程不会发生阻塞,而是继续处理其它代码或请求。如果阻塞......
  • jsp“云味坊”购物网站9u653
    jsp“云味坊”购物网站9u653本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,商品分类,商品品牌,热销商品,促销商品技术要求:   开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用Spr......
  • jsp“云课堂”在线教育系统的设计与开发87j57
    jsp“云课堂”在线教育系统的设计与开发87j57本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能学生,教师,课程分类,课程信息,课程练习,问题提问,在线沟通技术要求:   开发语言:JSP前端使用:HTML......
  • jsp“永梦”无人售货机系统管理的设计与实现bt3q1
    jsp“永梦”无人售货机系统管理的设计与实现bt3q1本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能商品分类,补货员,维修员,用户,商品信息,设备报修,订单信息开题报告内容一、项目背景与意义随着科......
  • Spring Boot 中使用 JSON Schema 来校验复杂JSON数据
    JSON是我们编写API时候用于数据传递的常用格式,那么你是否知道JSONSchema呢?在数据交换领域,JSONSchema以其强大的标准化能力,为定义和规范JSON数据的结构与规则提供了有力支持。通过一系列精心设计的关键字,JSONSchema能够详尽地描述数据的各项属性。然而,仅凭JSONSchema......