美文网首页让前端飞Web前端之路
Nest.js学习之路(13)- Interceptor in

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

作者: cbw100 | 来源:发表于2019-06-17 01:14 被阅读5次

    除了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<any>,
      ): Observable<any> {
        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测试

    2018110901.png
    2018110902.png

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

    tuiguang.png

    相关文章

      网友评论

        本文标题:Nest.js学习之路(13)- Interceptor in

        本文链接:https://www.haomeiwen.com/subject/tyxoxqtx.html