在 Nest.js 中,拦截器是可以在控制器方法执行前后、服务方法执行前后、异常处理等场景下执行的类。拦截器可以用于对请求进行预处理、记录日志、处理异常等操作。可以使用 @UseInterceptors() 装饰器将拦截器应用到控制器方法或者服务方法中。
首先,需要创建一个拦截器类 LoggingInterceptor,实现 NestInterceptor 接口,该接口定义了拦截器的 intercept() 方法,该方法接受两个参数:ExecutionContext 和 CallHandler,分别表示执行上下文和控制器方法或者服务方法的处理器。
typescript
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from ‘@nestjs/common’;
import { Observable } from ‘rxjs’;
import { tap } from ‘rxjs/operators’;
import { Logger } from ‘@nestjs/common’;
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
private readonly logger = new Logger(LoggingInterceptor.name);
intercept(context: ExecutionContext, next: CallHandler): Observable {
const request = context.switchToHttp().getRequest();
const method = request.method;
const url = request.url;
const now = Date.now();
return next
.handle()
.pipe(
tap(() => {
this.logger.log(`${method} ${url} ${Date.now() – now}ms`);
}),
);
}
}
上面的代码中,LoggingInterceptor 拦截器实现了 NestInterceptor 接口,并在 intercept() 方法中记录了请求的方法、URL 和处理时间。