本章介绍如何在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);
}