NestJs 异常过滤器

🎄Hi~ 大家好,我是小鑫同学,资深 IT 从业者,InfoQ 的签约作者,擅长前端开发并在这一领域有多年的经验,致力于分享我在技术方面的见解和心得

🚀技术&代码分享

  • 我在 94Code 总结技术学习;
  • 我在 1024Code 在线编写代码;
  • 我在 掘金 分享技术文章;
  • 我在 Github 参与开源学习;

😇推荐几个好用的工具

进入正题

异常过滤器负责处理整个应用程序中所有被抛出的异常,通过内置的和自定义的异常类可以规范一系列的异常状况,用来友好的提醒用户。

基础项目准备

推荐你来1024Code Fork 我的《Nest Exception Filters》 开始这次学习,如果你不习惯使用在线的IDE,那么可以将项目导出到本地运行~

基础异常类

HttpException 是 Nest 内置的基础异常类,由状态码和消息体两部分组成。状态码对应HTTP状态码,消息体按类型则分为下面两种情况:

情况1:

string 类型信息体用于对HTTP状态码进行简短的描述,使用方式及返回结果如下:

{
"statusCode": 403,
"message": "未授权,禁止访问"
}

情况2:

object 类型消息体用于覆盖整个响应体,返回给用户完全自定义的结果。

{
"status": 403,
"message": "未授权,禁止访问",
"timestamp": "2023-06-05T09:31:06.196Z"
}

自定义异常类

自定义异常类需要继承 Nest 内置的基础异常类(HttpException)后进行定义,体现了面向对象中继承和重写的两大重要概念。

内置异常类

下面列举了Nest 内置的一些异常类:

内置异常类表示/含义
BadRequestException表示客户端发送了无效的请求,例如缺少必需的参数或格式不正确的参数。
UnauthorizedException表示客户端未经授权访问受保护的资源。
NotFoundException表示请求的资源不存在。
ForbiddenException表示客户端没有访问请求资源的权限。
NotAcceptableException表示服务器无法提供客户端请求的内容类型。
RequestTimeoutException表示客户端请求超时。
ConflictException表示请求的操作与当前资源状态冲突。
GoneException表示请求的资源已经不存在。
PayloadTooLargeException表示请求的负载太大,服务器无法处理。
UnsupportedMediaTypeException表示请求的媒体类型不受支持。
UnprocessableException表示请求无法处理,因为它包含无效的数据。
InternalServerErrorException表示服务器内部错误。
NotImplementedException表示请求的操作尚未实现。
BadGatewayException表示网关或代理服务器从上游服务器接收到无效的响应。
ServiceUnavailableException表示服务当前不可用。
GatewayTimeoutException表示网关或代理服务器在等待上游服务器响应时超时。

自定义异常过滤器

Nest 内置全局异常过滤器,使用内置的异常类和自定义自异常均会被内置全局异常过滤器拦截,当内置的全局异常过滤器无法满足实际的要求时就需要使用到自定义的异常过滤器了。

如:发生异常时希望将记录异常信息记录到日志系统。就可以通过自定义异常过滤器获取异常层的完全控制权,通过读取底层的 Request 和 Response 对象,获取所需要记录到日志中的信息。

创建过滤器

通过使用 CLI 指令:nest g f http-exception,创建如下的过滤器:

自定义的过滤器通过 @Catch() 装饰器约束所需要被拦截的异常类,当此装饰器不约束特定的异常类时则表示拦截任何一个异常:

通过指定清晰的泛型 T,得到有效的函数签名,在后续的操作中将更加的明确:

一个较为完整的异常过滤器如下:

绑定过滤器

创建好的自定义过滤器同样要通过绑定才能生效,绑定的范围可以是具体控制器的方法、具体的控制器和全局范围。

方法范围和控制器范围绑定方式一致,如下图所示:

全局范围绑定过滤器提供了两种方式,一种是通过app实例调用useGlobalFilters函数绑定,缺点是在任何模块外进行注册的过滤器不能注入依赖;另一种方式就是将过滤器绑定到根模块。

方式1:

方式2:

总结

以上就是 Nest 中异常类及异常过滤器的自定义及使用,异常处理在服务端开发中尤为重要,合理的进行异常的抛出和捕获可以体现出项目架构的合理和健壮性。


如果看完觉得有收获,欢迎点赞、评论、分享支持一下。你的支持和肯定,是我坚持写作的动力~

posted @   前端小鑫同学  阅读(25)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示