NestJS中使用拦截器

2024-09-11 15:56:06 浏览数 (4)

在NestJS中,拦截器是一种强大的工具,可以用来在请求处理的不同阶段执行一些操作。拦截器可以用于日志记录、验证、转换请求和响应等任务。今天就看看如何在NestJS中使用拦截器。

什么是拦截器?

拦截器是一个实现了NestInterceptor接口的类。它可以在请求处理的不同阶段执行一些操作,例如在请求到达控制器之前或之后执行一些逻辑。拦截器可以用于日志记录、验证、转换请求和响应等任务。

如何创建拦截器?

要创建一个拦截器,需要创建一个实现了NestInterceptor接口的类。

代码语言:javascript复制
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装饰器。

代码语言:javascript复制
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装饰器来应用拦截器,比如:

代码语言:javascript复制
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装饰器,可以轻松地使用拦截器。

0 人点赞