nest 限制请求频率 Throttler

时间:2023-01-05 浏览:175 分类:NestJS

可以全局设置或者在相应模块下设置,如果全局设置需在 app.module

第一步:安装依赖

$ npm i --save @nestjs/throttler

第二步:引入Throttler模块

// 全局引入为例 app.module.ts‘
@Module({
  imports: [ThrottlerModule.forRoot({
    ttl: 30,  //设置默认30s允许请求2次,超出返回429 code错误
    limit: 2,
  })],
  controllers: [AppController],
  providers: [AppService],
})

第三步:引入守卫Guard服务

import {APP_GUARD} from "@nestjs/core";
import {ThrottlerGuard, ThrottlerModule} from "@nestjs/throttler";

@Module({
  imports: [ThrottlerModule.forRoot({
    ttl: 30,
    limit: 2,
  })],
  controllers: [AppController],
  providers: [AppService,{
    provide: APP_GUARD,
    useClass: ThrottlerGuard
  }]
})

第三步:相应控制器路由下设置阈值

// user.controller.ts

import {Throttle} from "@nestjs/throttler";

export class UserController {
    constructor(private readonly userService: UserService) {
    }
    
    @Throttle(2, 30) //手动设置30s允许请求2次,超出返回429 code错误
    @Post('/submit')
    @UsePipes(new ValidationPipe({transform: true}))
    submit(@Body() body: Person) {
        return this.userService.submit(body);
    }
    
}

注意:

引入ThrottlerModule.forRoot ( ) 参数可以为空,为空时需要在相应控制器路由指定阈值 Throttle,如果设置了默认阈值参数,那么即适用于当前模块下的所有路由,如果想排除某一路由,则可以使用 SkipThrottle 装饰器,如下:

import {SkipThrottle} from "@nestjs/throttler";

@SkipThrottle()
@Get('/')
@UsePipes(new ValidationPipe({transform: true}))
index(@Query() query: Person) {
    return this.userService.index(query);
}