【Nest教程】自定義攔截器處理處理響應數據

攔截器(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

  • handle()返回一個Observable,這裏咱們攔截響應數據,給相應數據外面套一層對象。

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請求方式請求

【Nest教程】自定義攔截器處理處理響應數據

咱們能夠看到,最外層是咱們自定義的,data裏是響應數據。文章裏沒有過多的講解理論知識,由於我也是剛開始學習Nest,只能是須要什麼就查什麼,記錄什麼。若是你也是對這個比較感興趣,咱們能夠共同交流學習。

相關文章
相關標籤/搜索