注:此文仅记录博主初次学习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 {
}