基础
每个拦截器都有 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: '这是一个测试拦截器的请求',
};
}),
);
}
}