UNPKG

nestjs-graphql-rate-limit

Version:

Rate Limit module with Redis storage support for NestJS GraphQL APIs

101 lines (78 loc) 2.6 kB
# 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.