Nest.js学习之路(13)- Interceptor in nest.js

除了middleware可以对原本request/response加工之外,nest.js提供interceptor可以对于程式要进入method之前与之后,执行一段程式或是对输入输出讯息做处理,称之Aspect-Oriented Programming(AOP)

Interceptor必须实作NestInterceptor接口

interceptor方法传入两个引数ExecutionContext

  • ExecutionContext: 可以取得controller、及http相关信息(http context)
  • call$: 这部分比较抽象,简单来说,call$就是回传到client的response stream,如果interceptor没有回传call$,则等于是controller处理完后不会丢回response

以改变reponse内容为例,把原本的response内容再添加额外信息

新增transformRes.interceoptor.ts

import { ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';

import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class TransformResInterceptor implements NestInterceptor { // 实现NestInterceptor接口
  intercept(
    context: ExecutionContext,
    call$: Observable,
  ): Observable {
    const controller = context.getClass().name; // 取得controller name
    const handler = context.getHandler().name; // 取得method name

    return call$.pipe(
      map(data => // 原response內容
        ({ // 改变response內容
          controller,
          handler,
          data,
        })),
    );
  }
}

在app.module.ts注册interceptor

...
@Module({
  imports: [SharedModule],
  controllers: [AppController],
  providers: [
    AppService,
    AuthGuard,
    HttpExceptionFilter,
    TransformResInterceptor,
  ],
})
export class AppModule implements NestModule{
...

用@UseInterceptors套用TransformResInterceptor

app.controller.ts

...
@Controller()
@UseFilters(HttpExceptionFilter)
@UseGuards(AuthGuard)
@UseInterceptors(TransformResInterceptor)
export class AppController {
  redisClient: redis.RedisClient;
  constructor(private appService: AppService){
    // this.redisClient = redis.createClient(6379, 'redis-server');
    // this.redisClient.set('counter', '0');
  }
  
  @Get()
  sayHello(){
    return this.appService.sayHello();
  }

  @Post()
  @UsePipes(UserDTOValidationPipe)
  @ReflectMetadata('roles', ['admin', 'superuser'])
  create(@Body() platformDTO: PlatformDTO){
    throw new HttpException('糟糕!您的要求有问题,请联系管理员', HttpStatus.BAD_REQUEST);
    return `平台:${platformDTO.platformname}已建立`;
  }
  ...

使用postman测试

Nest.js学习之路(13)- Interceptor in nest.js_第1张图片
2018110901.png

Nest.js学习之路(13)- Interceptor in nest.js_第2张图片
2018110902.png

推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。

tuiguang.png

你可能感兴趣的:(Nest.js学习之路(13)- Interceptor in nest.js)