【前端学习】 NestJS 之 异常过滤器 (Exception filters)

异常过滤器 (Exception filters)

Nest 自带一个内置的异常层,来负责处理应用中所有未处理的异常。当你的应用代码未处理异常时,该层会捕获该异常,然后自动发送适当的用户友好响应。

并且该异常层开箱即用,由内置的全局异常过滤器执行。该过滤器处理HttpException类型 (及其子类 ) 的异常。当异常无法识别时 (即: 不是HttpException也不是继承自HttpException的类) ,内置异常过滤器会生成以下默认JSON 响应:

{
   
   
	"statusCode": 500,
	"message": "Internal server error"
}

*抛出标准异常

Nest 提供了一个内置的HttpException类,从@nestjs/common包中暴露出来。对于典型的基于 HTTP REST/GraphQL API 的应用,最佳做法是在发生某些错误情况时发送标准 HTTP 响应对象。

例如,在我们之前编写的DogsController中,有一个findAll()方法 ( GET 路由处理程序) 。假设它因为某原因抛出了异常。为了证明该点,我们可以做如下尝试:

/* dogs.controller.ts */
// ...
import {
   
    HttpException, HttpStatus } from "@nestjs/common";

@Get()
async findAll() {
   
   
	throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
}
// ...

然后当客户端调用此端点时 (即你在浏览器上访问这个GET接口) ,它的响应会如下:

{
   
   
	"statusCode": 403,
	"message": "Forbidden"
}

如图:

抛出标准异常

在书写代码时,你应该可以从TS 的编译报错中已经发现了这个问题:

HttpException构造函数需要采用两个必需的参数来确定响应

  • response参数 定义JSON 响应主体。它可以是stringobject,如下所述:

  • status参数 定义了HTTP 状态码。

在默认情况下,JSON 响应主体包含两个属性:

  • statusCode: 默认为status参数中提供的HTTP 状态代码;

  • message: 基于status的HTTP 错误的简短描述。

所以如果仅覆盖JSON 响应正文的消息部分,请在response参数中提供一个字符串;如果要覆盖整个JSON 响应主体,请在response参数中传递一个对象。Nest 会序列化该对象并将其作为JSON 响应主体来返回。

提一嘴HttpException构造函数是有第三个可选的参数的,名为options,它可以用于提供错误 causecause对象并不会被序列化到相应对象中 (即 你在响应主体里是看不到它的 ) ,但是它对于抛出的内部错误的信息会作为日志 (log) 来记录与保存。

下方是一个覆盖整个响应主体并提供cause的示例:

/* dogs.controller.ts */

// ...
@Get()
async findAll() {
   
   
	try {
   
   
		await this.service
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值