在接收一個接口請求與響應的整個過程當中,因爲不肯定因素太多,一定會遇到各類異常的情況,但凡使用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();對象
重啓項目,訪問不存在的接口地址,就能夠看到效果了。