JS后端框架 Nest.js入门篇 拦截器aop、Interceptor(六)

注:此文仅记录博主初次学习nestjs之后的认识和理解,经验尚浅,文章内容仅供参考,如若有误,敬请指正。

作为切面

此文暂不对细节展开探讨

1.切面类型:NestInterceptor接口实现类

2.切面输入

ExecutionContext对象:执行上下文对象,继承至参数主机对象ArgumentsHost
next函数

3.切面输出:next进入下一个切面(可携带后拦截器逻辑)

4.切面使用场景

  • 在函数执行之前/之后绑定额外的逻辑
  • 转换从函数返回的结果
  • 转换从函数抛出的异常
  • 扩展基本函数行为
  • 根据所选条件完全重写函数 (例如, 缓存目的)

拦截器简单案例

1.拦截器定义

import {
    
     Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import {
    
     Observable } from 'rxjs';
import {
    
     tap } from 'rxjs/operators';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
    
    
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    
    
    // return之前:前拦截器逻辑
      console.log('Before...');

    const now = Date.now();
    return next
      .handle()// handle之后:后拦截器逻辑
      .pipe(
        // catchError(err => throwError(new BadGatewayException())),// 覆盖异常,在异常过滤器切面之前
        tap(() => console.log(`After... ${
      
      Date.now() - now}ms`)),
      );
  }
}

2.拦截器绑定

  • 绑定到方法
@UseInterceptors(LoggingInterceptor)
export class CatsController {
    
    }
  • 绑定到全局(app.module.ts)
import {
    
     Module } from '@nestjs/common';
import {
    
     APP_INTERCEPTOR } from '@nestjs/core';

@Module({
    
    
  providers: [
    {
    
    
      provide: APP_INTERCEPTOR,
      useClass: LoggingInterceptor,
    },
  ],
})
export class AppModule {
    
    }

猜你喜欢

转载自blog.csdn.net/jw2268136570/article/details/107840571