nestjs-redis icon indicating copy to clipboard operation
nestjs-redis copied to clipboard

Redis(ioredis) module for Nest framework (node.js).

NPM Downloads Stargazers Issues Vulnerabilities License

Nest Logo

Nest Redis Module

Redis(ioredis) module for Nest framework (node.js).
Explore the docs »

View Demo · Report Bug · Request Feature

Table of Contents
  1. About The Project
    • Features
    • Test coverage
  2. Getting Started
    • Prerequisites
    • Installation
  3. Usage
  4. Circular dependency
  5. FAQs
  6. Roadmap
  7. Contributing
  8. License
  9. Acknowledgments
  10. Package dependency overview

About The Project

Features

  • Both redis & cluster are supported: You can also specify multiple instances.
  • Health: Checks health of redis & cluster server.
  • Rigorously tested: With 100+ tests and 100% code coverage.
  • Decorators: Injects redis & cluster clients via @InjectRedis(), @InjectCluster().
  • Services: Retrieves redis & cluster clients via RedisService, ClusterService.
  • Testing: Generates an injection token via getRedisToken, getClusterToken.

Test coverage

Statements Branches Functions Lines
Statements Branches Functions Lines

Getting Started

Prerequisites

This lib requires Node.js >=12.22.0, NestJS ^9.0.0, ioredis ^5.0.0.

  • If you depend on ioredis 4, please use version 7 of the lib.
  • If you depend on ioredis 5, NestJS 7 or 8, please use version 8 of the lib.

Installation

# with npm
npm install @liaoliaots/nestjs-redis ioredis
# with yarn
yarn add @liaoliaots/nestjs-redis ioredis
# with pnpm
pnpm add @liaoliaots/nestjs-redis ioredis

Usage

  • Redis
    • Usage
    • Configuration
    • Testing
    • Non-Global
    • Auto-reconnect
    • Unix domain socket
  • Cluster
  • Health Checks
  • Examples
    • Redis Sentinel

Legacy

  • version 7, click here
  • version 8, click here

Circular dependency ⚠️

WARNING: A circular dependency might also be caused when using "barrel files"/index.ts files to group imports. Barrel files should be omitted when it comes to module/provider classes. For example, barrel files should not be used when importing files within the same directory as the barrel file, i.e. cats/cats.controller should not import cats to import the cats/cats.service file. For more details please also see this github issue.

FAQs

"Cannot resolve dependency" error

Click to expand

If you encountered an error like this:

Nest can't resolve dependencies of the <provider> (?). Please make sure that the argument <unknown_token> at index [<index>] is available in the <module> context.

Potential solutions:
- If <unknown_token> is a provider, is it part of the current <module>?
- If <unknown_token> is exported from a separate @Module, is that module imported within <module>?
  @Module({
    imports: [ /* the Module containing <unknown_token> */ ]
  })

Please make sure that the RedisModule is added directly to the imports array of @Module() decorator of "Root Module"(if isGlobal is true) or "Feature Module"(if isGlobal is false).

Examples of code:

// redis-config.service.ts
import { Injectable } from '@nestjs/common';
import { RedisModuleOptions, RedisOptionsFactory } from '@liaoliaots/nestjs-redis';

@Injectable()
export class RedisConfigService implements RedisOptionsFactory {
  createRedisOptions(): RedisModuleOptions {
    return {
      readyLog: true,
      config: {
        host: 'localhost',
        port: 6379,
        password: 'authpassword'
      }
    };
  }
}

✅ Correct

// app.module.ts
import { Module } from '@nestjs/common';
import { RedisModule } from '@liaoliaots/nestjs-redis';
import { RedisConfigService } from './redis-config.service';

@Module({
  imports: [
    RedisModule.forRootAsync({
      useClass: RedisConfigService
    })
  ]
})
export class AppModule {}

❌ Incorrect

// my-redis.module.ts
import { Module } from '@nestjs/common';
import { RedisModule } from '@liaoliaots/nestjs-redis';
import { RedisConfigService } from './redis-config.service';

@Module({
  imports: [
    RedisModule.forRootAsync({
      useClass: RedisConfigService
    })
  ]
})
export class MyRedisModule {}
// app.module.ts
import { Module } from '@nestjs/common';
import { MyRedisModule } from './my-redis.module';

@Module({
  imports: [MyRedisModule]
})
export class AppModule {}

Roadmap

  • [x] Compatible with NestJS ^9

Contributing

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

License

Distributed under the MIT License. See LICENSE for more information.

Acknowledgments