在NestJS中,拦截器是一种强大的工具,可以用来在请求处理的不同阶段执行一些操作。拦截器可以用于日志记录、验证、转换请求和响应等任务。今天就看看如何在NestJS中使用拦截器。
拦截器是一个实现了NestInterceptor接口的类。它可以在请求处理的不同阶段执行一些操作,例如在请求到达控制器之前或之后执行一些逻辑。拦截器可以用于日志记录、验证、转换请求和响应等任务。
要创建一个拦截器,需要创建一个实现了NestInterceptor接口的类。
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`)),
);
}
}
这里创建了一个名为LoggingInterceptor的拦截器,它实现了NestInterceptor接口。在intercept方法中,首先打印一条消息,然后记录当前时间。然后调用next.handle()方法来处理请求,并使用tap操作符在请求处理完成后打印一条消息,并计算处理请求所需的时间。
要使用拦截器,需要在模块的providers数组中注册它,并在需要使用它的路由处理器或控制器上添加@UseInterceptors装饰器。
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { LoggingInterceptor } from './logging.interceptor';
import { AppController } from './app.controller';
@Module({
controllers: [AppController],
providers: [
{
provide: APP_INTERCEPTOR,
useClass: LoggingInterceptor,
},
],
})
export class AppModule {}
这里在AppModule中注册了LoggingInterceptor,并将其作为全局拦截器使用。这意味着LoggingInterceptor将应用于所有路由处理器和控制器。
也可以在特定的路由处理器或控制器上使用@UseInterceptors装饰器来应用拦截器,比如:
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
import { LoggingInterceptor } from './logging.interceptor';
@Controller()
@UseInterceptors(LoggingInterceptor)
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
这里在CatsController上使用了@UseInterceptors装饰器来应用LoggingInterceptor。这意味着LoggingInterceptor将只应用于CatsController中的路由处理器。
拦截器是NestJS中一个非常强大的工具,可以用于在请求处理的不同阶段执行一些操作。通过创建一个实现了NestInterceptor接口的类,并在需要使用它的路由处理器或控制器上添加@UseInterceptors装饰器,可以轻松地使用拦截器。