Implementación de Caché en NestJS con Redis

Resumen del Problema

Al intentar implementar un sistema de caché en un proyecto de NestJS utilizando Redis como almacenamiento, se presenta un error de importación relacionado con la inyección del CACHE_MANAGER. Específicamente, el error indica: "Please make sure that the argument ‘CACHE_MANAGER’ at index [0] is available in the ItemModule context", incluso después de agregar MyCacheModule a los imports de ItemModule.

Solución Propuesta

1. Verifique el Módulo de Caché

Asegúrese de que el módulo de caché (MyCacheModule) esté correctamente configurado y exportado. Esto permitirá que otros módulos lo importen correctamente.

import { Module } from '@nestjs/common';
import { CacheModule } from '@nestjs/cache-manager';
import { ConfigModule, ConfigService } from '@nestjs/config';
import * as redisStore from 'cache-manager-redis-store';

@Module({
    imports: [
        CacheModule.registerAsync({
            imports: [ConfigModule],
            useFactory: async (configService: ConfigService) => ({
                isGlobal: true,
                store: redisStore,
                host: configService.get<string>('cache.host') || 'localhost',
                port: configService.get<number>('cache.port') || 6379,
                ttl: 60,
            }),
            inject: [ConfigService],
        }),
    ],
    exports: [CacheModule],  // Asegúrese de exportar el CacheModule
})
export class MyCacheModule {}

2. Importar el Módulo en ItemModule

Asegúrese de que está importando MyCacheModule en el ItemModule. Aquí hay un ejemplo de cómo debería verse el ItemModule:

import { Module } from '@nestjs/common';
import { ItemService } from './item.service';
import { MyCacheModule } from './my-cache.module'; // Ajuste la ruta según su estructura

@Module({
    imports: [MyCacheModule], // Asegúrese de importar el módulo aquí
    providers: [ItemService],
})
export class ItemModule {}

3. Uso Correcto del CACHE_MANAGER

En el ItemService, la inyección del CACHE_MANAGER debería funcionar adecuadamente si MyCacheModule está correctamente importado. Aquí está el ItemService como referencia:

import { CACHE_MANAGER } from '@nestjs/cache-manager';
import { Inject, Injectable } from '@nestjs/common';
import { Cache } from 'cache-manager';

@Injectable()
export class ItemService {
    constructor(@Inject(CACHE_MANAGER) private readonly _cache: Cache) {}

    async getItem(id: string) {
        const cachedUser = await this._cache.get(`item_${id}`);

        if (cachedUser) {
            return cachedUser;
        }

        const item = {
            id: 50,
            name: 'item',
        }; /** Este sería un llamado a la base de datos */

        await this._cache.set(`item_${id}`, item, 60); // Cache por 60 segundos

        return item;
    }
}

4. Verificación de la Configuración

  • Asegúrese de que el módulo de configuración (ConfigModule) esté importado y configurado correctamente en el módulo raíz de su aplicación.
  • Asegúrese de que los valores de cache.host y cache.port estén definidos en su archivo de configuración.

Conclusión

Siguiendo estos pasos, debería poder resolver el problema de inyección del CACHE_MANAGER en su servicio de NestJS. Asegúrese siempre de que los módulos estén bien importados y exportados, especialmente cuando se utilizan proveedores globales como el CACHE_MANAGER.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *