nestjs-graphql-rate-limit
Version:
Rate Limit module with Redis storage support for NestJS GraphQL APIs
101 lines (78 loc) • 2.6 kB
Markdown
# NestJS GraphQL Rate Limit
A Rate Limit implementation for GraphQL APIs using NestJS
## Installation
```npm install nestjs-graphql-rate-limit```
## How to use it?
- After installing the package, make sure you have Redis installed and running.
See [Redis Docker Image](https://hub.docker.com/_/redis)
- Set `STORE_HOST` `STORE_PORT` `STORE_THROTTLE_DB` environment variables in your Nest project.
Example:
```dotenv
#Depending on where you run and which hostname you set, set your hostname.
#If you run it locally you can set it to "localhost" or if you run it on Docker, you can set whatever hostname you gave.
STORE_HOST=redis
STORE_PORT=6379
#DB option is up to you between 0-15.
STORE_THROTTLE_DB=2
```
- Make sure you are returning the execution context.
```typescript
GraphQLModule.forRoot({
context: ({ req, res }) => ({ req, res }),
})
```
- Import `GqlRateLimitModule` module into your Nest project. (Assuming you will throttle your Query & Mutations globally,
importing into `AppModule` is highly recommended for availability reasons)
Example:
```typescript
// app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { AppResolver } from 'src/app.resolver';
import { GraphQLError } from 'graphql';
import { GqlRateLimitModule } from 'nestjs-graphql-rate-limit';
@Module({
imports: [
GqlRateLimitModule,
GraphQLModule.forRoot({
autoSchemaFile: true,
context: ({ req, res }) => ({ req, res }),
formatError: (error: GraphQLError) => {
return {
message: error.message,
status: error.extensions.exception.status,
};
},
}),
],
providers: [AppResolver],
})
export class AppModule {}
```
## Usage
```typescript
// app.resolver.ts
import { Query, Resolver } from '@nestjs/graphql';
import { RateLimit } from 'nesjs-graphql-rate-limit';
@Resolver()
export class AppResolver {
@Query(() => String)
@RateLimit(2, 10)
async someQuery(): Promise<string> {
return 'Hello from throttled query';
}
}
```
## Documentation
- `RateLimit`
Takes `limit` `ttl` arguments in given order.
Argument | Type | Description
--- | ---- | -------
limit | number| Amount of requests client can make in given TTL
ttl | number| Time-to-live in seconds
Notes:
`@RateLimit(2, 10)` means, client can only make `2` requests in `10` seconds.
Expected behaviour:
After exceeding the limit of 2 requests, server will respond with `X-Retry-After` header and rate limit will reset after 10 seconds starting from the last second request.