文章目录
异常过滤器 (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 响应主体。它可以是string或object,如下所述: -
status参数 定义了HTTP 状态码。
在默认情况下,JSON 响应主体包含两个属性:
-
statusCode: 默认为status参数中提供的HTTP 状态代码; -
message: 基于status的HTTP 错误的简短描述。
所以如果仅覆盖JSON 响应正文的消息部分,请在response参数中提供一个字符串;如果要覆盖整个JSON 响应主体,请在response参数中传递一个对象。Nest 会序列化该对象并将其作为JSON 响应主体来返回。
提一嘴:HttpException构造函数是有第三个可选的参数的,名为options,它可以用于提供错误 cause。cause对象并不会被序列化到相应对象中 (即 你在响应主体里是看不到它的 ) ,但是它对于抛出的内部错误的信息会作为日志 (log) 来记录与保存。
下方是一个覆盖整个响应主体并提供cause的示例:
/* dogs.controller.ts */
// ...
@Get()
async findAll() {
try {
await this.service

最低0.47元/天 解锁文章
1044

被折叠的 条评论
为什么被折叠?



