在接收一个接口请求与响应的整个过程当中,因为不肯定因素太多,一定会遇到各类异常的情况,但凡使用throw 抛出的异常均可以经过异常过滤器来获取到其异常内容而后能够自定义修改返回给前端。前端
前面讲了项目的初始化及拦截器的简单使用,这章咱们简单讲下对于异常的处理,对项目增长一个自定义过滤器。Nest内置的异常层负责处理整个应用中抛出的全部异常,当捕获到异常并自定义修改,最终用户将收到友好的响应。json
具体的用法及参数这里就不过多的说明,了解能够参考官方文档:bootstrap
https://docs.nestjs.cn/7/exceptionfilters
咱们对以前新建的项目作个自定义的返回,首先为了项目方便管理。在src下新建文件夹filters,文件夹下新建http-exception.filter.ts文件,内容以下:app
import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus, Logger, } from '@nestjs/common'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const request = ctx.getRequest(); const message = exception.message; Logger.log('错误提示', message); const errorResponse = { data: { error: message, }, // 获取所有的错误信息 message: '请求失败', code: 1, // 自定义code url: request.originalUrl, // 错误的url地址 }; const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; // 设置返回的状态码、请求头、发送错误信息 response.status(status); response.header('Content-Type', 'application/json; charset=utf-8'); response.send(errorResponse); } }
@Catch() 装饰器绑定所需的元数据到异常过滤器上。它告诉 Nest这个特定的过滤器正在寻找 HttpException 而不是其余的。catch() 方法有两个参数。async
exception 参数是当前正在处理的异常对象ide
详细信息参考:url
https://docs.nestjs.cn/7/exceptionfilters?id=%e5%8f%82%e6%95%b0%e4%b8%bb%e6%9c%ba
咱们将过滤器绑定到应用程序入口文件上code
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './filters/http-exception.filter';
import { TransformInterceptor } from './interceptor/transform.interceptor';orm
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
app.useGlobalInterceptors(new TransformInterceptor());
await app.listen(3000);
}
bootstrap();对象
重启项目,访问不存在的接口地址,就能够看到效果了。