攔截器(Interceptors)是一個使用 @Injectable() 裝飾的類,它必須實現 NestInterceptor 接口。bootstrap
前面講了基於Nest生成Web API項目,若是不清楚請移步:【Nest教程】基於Nest初始化Web API項目,文章只講解了使用腳手架搭建簡單的項目而且能夠正常運行。app
今天咱們講下自定義攔截器,Nest攔截器功能很強大,能夠在函數執行以前/以後綁定額外的邏輯、轉換從函數返回的結果、轉換從函數拋出的異常、擴展基本函數行爲等。咱們在以前的項目基礎上增長自定義攔截器,轉換從函數返回的結果。async
1 建立自定義攔截器ide
咱們在咱們項目目錄src下新建interceptor文件夾,文件夾下新建transform.interceptor.ts文件,文件內容以下:函數
import { Injectable, NestInterceptor, CallHandler, ExecutionContext, } from '@nestjs/common'; import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; interface Response<T> { data: T; } @Injectable() export class TransformInterceptor<T> implements NestInterceptor<T, Response<T>> { intercept( context: ExecutionContext, next: CallHandler<T>, ): Observable<Response<T>> { return next.handle().pipe( map(data => { return { data, code: 0, message: '請求成功', }; }), ); } }
注意:用到了rxjs模塊,須要先安裝post
yarn add rxjs
每一個攔截器都有intercept(ExecutionContext, CallHandler)方法,第一個參數是執行上下文,第二個參數是調用處理程序學習
CallHandler是一個包裝執行流的對象。所以。必須手動調用hander()方法,最終方法纔會被觸發3d
2 項目綁定自定義攔截器code
綁定攔截器也是比較簡單,咱們在項目src目錄下,main.ts文件導入咱們新建的文件,綁定便可orm
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { TransformInterceptor } from './interceptor/transform.interceptor'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalInterceptors(new TransformInterceptor()); await app.listen(3000); } bootstrap();
3 啓動項目查看效果
啓動項目
yarn start
用postman get請求方式請求
咱們能夠看到,最外層是咱們自定義的,data裏是響應數據。文章裏沒有過多的講解理論知識,由於我也是剛開始學習Nest,只能是須要什麼就查什麼,記錄什麼。若是你也是對這個比較感興趣,咱們能夠共同交流學習。