Nest 带有一个内置的异常层,负责处理应用程序中所有未经处理的异常。当应用程序代码未处理异常时,该异常将被该层捕获,然后该层自动发送适当的用户友好响应
该筛选器处理类型
HttpException (及其子类)的异常。
如:
throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);
得到的响应:
{
"statusCode": 403,
"message": "Forbidden"
}
当异常无法识别(既不是 HttpException 也不是继承自 HttpException 的类)时,内置异常筛选器将生成以下默认 JSON 响应:
{
"statusCode": 500,
"message": "Internal server error"
}
HttpException 标准异常
Nest 提供了一个内置 HttpException 类,HttpException 构造函数采用两个必需的参数来确定响应
- 该
response参数定义 JSON 响应正文。它可以是 astring或 anobject,如下所述 - • 该
status参数定义 HTTP 状态代码。nest提供了一个HttpStatus枚举
默认情况下,JSON 响应正文包含两个属性:
statusCode:默认为status参数中提供的 HTTP 状态代码message:基于statusHTTP 错误的简短描述
若要仅覆盖 JSON 响应正文的消息部分,请在 response 参数中提供字符串。若要覆盖整个 JSON 响应正文,请在 response 参数中传递一个对象。Nest 将序列化对象并将其作为 JSON 响应正文返回。
Nest 提供了一组继承自 base HttpException 的标准异常:
BadRequestExceptionUnauthorizedExceptionNotFoundExceptionForbiddenExceptionNotAcceptableExceptionRequestTimeoutExceptionConflictExceptionGoneExceptionHttpVersionNotSupportedExceptionPayloadTooLargeExceptionUnsupportedMediaTypeExceptionUnprocessableEntityExceptionInternalServerErrorExceptionNotImplementedExceptionImATeapotExceptionMethodNotAllowedExceptionBadGatewayExceptionServiceUnavailableExceptionGatewayTimeoutExceptionPreconditionFailedException
使用:
throw new BadRequestException('Something bad happened');
自定义异常过滤器
定义:
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();
response
.status(status)
.json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
绑定:
@Post()
@UseFilters(new HttpExceptionFilter())
async create(@Body() createCatDto: CreateCatDto) {
throw new ForbiddenException();
}
全局过滤器
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
bootstrap();
或:
import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_FILTER,
useClass: HttpExceptionFilter,
},
],
})
export class AppModule {}