3-9:限流

4 阅读1分钟

本章介绍如何在NestJS中进行限流。 在app.module.ts的import中传入配置项

ThrottlerModule.forRoot([
      {
        name: 'short',
        ttl: 1000,
        limit: 3,
      },
      {
        name: 'medium',
        ttl: 10000,
        limit: 20,
      },
      {
        name: 'long',
        ttl: 60000,
        limit: 100,
      },
    ]),

我们可以把其中的配置项单独导出到config

import { ThrottlerModuleOptions } from '@nestjs/throttler';

export const rateLimitConfig: ThrottlerModuleOptions = [
  {
    name: 'short',
    ttl: 1000,
    limit: 3,
  },
  {
    name: 'medium',
    ttl: 10000,
    limit: 20,
  },
  {
    name: 'long',
    ttl: 60000,
    limit: 100,
  },
];

这样就可以简化为 ThrottlerModule.forRoot(rateLimitConfig) 最后,我们需要把它应用在端点中。将它绑定在app.module.ts中的provider,即可全局使用

providers: [
    AppService,
    {
      provide: APP_GUARD,
      useClass: ThrottlerGuard,
    },
  ],

不过如果一些端点需要更精细的限流控制应该怎么做呢?
可以使用装饰器@SkipThrottle()@Throttle()
@SkipThrottle()可以跳过当前全局限流的控制;@Throttle()单独对限流进行控制

 @Get()
 //覆盖掉默认的限流配置
  @Throttle({default:{ttl:1000, limit:3}})
  findAll(@Query() filterTodoDto: FilterTodoDto) {
    return this.todosService.findAll(filterTodoDto);
  }