nest开发:七 拦截器

152 阅读1分钟

基础

每个拦截器都有 intercept() 方法,它接收2个参数。 第一个是 ExecutionContext 实例(与守卫完全相同的对象)。 ExecutionContext 继承自 ArgumentsHost 。 ArgumentsHost 是传递给原始处理程序的参数的一个包装 ,它根据应用程序的类型包含不同的参数数组。你可以在这里读更多关于它的内容(在异常过滤器章节中)。
我们可以拿一个官方的例子来看一下

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> {
    console.log('Before...');

    const now = Date.now();
    return next
      .handle()
      .pipe(
        tap(() => console.log(`After... ${Date.now() - now}ms`)),
      );
  }
}

这个代码主要是对一个请求处理的时间做了一个统计。所以我们可以得到拦截器是分一个前后的操作的,前拦截器和后拦截器。我们可以在这里进行一些操作,例如做一个定义返回值格式的规范。

@Injectable()
export class YuicInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log('Before...');
    const request = context.switchToHttp().getRequest();
    request.yuicInterInfo = {
      name: 'yuicInterInfo',
    };
    // const now = Date.now();
    return next.handle().pipe(
      map((data) => {
        return {
          data: data,
          status: 0,
          message: '这是一个测试拦截器的请求',
        };
      }),
    );
  }
}

image.png