拦截器
2024年3月2日...大约 1 分钟
什么是拦截器
拦截器 (Interceptors) 是 Nest 提供的一种中间件机制,用于在请求前后对数据进行拦截处理。
创建拦截器
我们使用以下命令创建一个拦截器:
nest g interceptor 拦截器名称
拦截器是一个使用 @Injectable()
装饰器装饰的类。拦截器应该实现 NestInterceptor 接口。它的内容如下:
// src/my-interceptor/my-interceptor.interceptor.ts
import {
CallHandler,
ExecutionContext,
Injectable,
NestInterceptor,
} from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class MyInterceptorInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle();
}
}
使用拦截器
我们可以使用多种方式来使用拦截器。
控制器中使用
我们可以将拦截器直接添加到控制器中:
// src/user/user.controller.ts
import { Controller, Get, Post, Body, UseInterceptors } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { MyInterceptorInterceptor } from 'src/my-interceptor/my-interceptor.interceptor';
@Controller('user')
@UseInterceptors(new MyInterceptorInterceptor())
export class UserController {
constructor(private readonly userService: UserService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto);
}
@Get()
findAll() {
return this.userService.findAll();
}
}
模块中定义
我们也可以在模块中定义拦截器:
// src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { MyInterceptorInterceptor } from './my-interceptor/my-interceptor.interceptor';
@Module({
imports: [UserModule],
controllers: [AppController],
providers: [
AppService,
{
provide: 'APP_INTERCEPTOR',
useClass: MyInterceptorInterceptor,
},
],
})
export class AppModule {}
全局使用
我们也可以在全局中使用拦截器,只需要在 main.ts
中进行配置:
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MyInterceptorInterceptor } from './my-interceptor/my-interceptor.interceptor';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new MyInterceptorInterceptor());
await app.listen(3000);
}
bootstrap();
Powered by Waline v3.3.2