O cache é uma técnica fundamental para melhorar o desempenho e a escalabilidade de suas aplicações. No Nest.js, o cache pode ser perfeitamente integrado usando o gerenciador de cache integrado. Neste artigo, exploraremos como criar um decorador @Cacheable personalizado para simplificar o armazenamento em cache em seus serviços ou controladores Nest.js.
Embora o Nest.js forneça mecanismos de cache poderosos prontos para uso, aplicar a lógica de cache diretamente em seus métodos pode sobrecarregar seu código. Um decorador personalizado abstrai essa lógica, tornando seu código mais limpo e mais fácil de manter.
Vamos começar criando o decorador @Cacheable que usaremos para armazenar em cache os resultados de nossos métodos.
import { Cache } from 'cache-manager'; export function Cacheable(cacheKey: string) { return function ( target: any, propertyName: string, descriptor: PropertyDescriptor, ) { const originalMethod = descriptor.value; descriptor.value = async function (...args: any[]) { const cache: Cache = this.cacheManager; if (!cache) { throw new Error( 'Cannot use Cacheable() decorator without injecting the cache manager.', ); } // Try to get cached data try { const cachedResult = await cache.get(cacheKey); if (cachedResult) { return cachedResult; } } catch (error) { console.error(`Cache get error for key: ${cacheKey}:`, error); } // Call the original method if cache miss const result = await originalMethod.apply(this, args); // Set the new result in cache try { await cache.set(cacheKey, result); } catch (error) { console.error(`Cache set error for key: ${cacheKey}:`, error); } return result; }; return descriptor; }; }
Veja como você pode aplicar o decorador @Cacheable a um método em seu serviço:
import { Injectable } from '@nestjs/common'; import { Cacheable } from './cacheable.decorator'; const SETTING_CACHE_KEY = 'settings'; @Injectable() export class SettingsService { // Inject the cache manager constructor(private readonly cacheManager: Cache) {} /** * Retrieves settings from the cache if available, or loads them from the * repository and caches the result. * * @returns A promise that resolves to a `Settings` object. */ @Cacheable(SETTING_CACHE_KEY) async getSettings(): Promise{ return await this.findAll(); } // ... other methods like findAll() and buildTree() }
Para usar o gerenciador de cache em sua aplicação, você precisa registrá-lo em seu módulo:
import { Module } from '@nestjs/common'; import { CacheModule } from '@nestjs/cache-manager'; import { SettingsService } from './settings.service'; @Module({ imports: [ CacheModule.register({ isGlobal: true, ttl: 300, // Time to live in seconds max: 100, // Maximum number of items in cache }), ], providers: [SettingsService], }) export class AppModule {}
Certifique-se de injetar o gerenciador de cache em qualquer serviço ou controlador que use o decorador @Cacheable:
import { Injectable } from '@nestjs/common'; import { Cache } from 'cache-manager'; @Injectable() export class SettingsService { constructor(private readonly cacheManager: Cache) {} // ... your methods }
Ao criar um decorador @Cacheable personalizado, você pode manter seus métodos limpos e focar na lógica central, deixando as preocupações de cache para o decorador. Essa abordagem melhora a legibilidade e a manutenção do código, tornando seu aplicativo Nest.js mais eficiente e escalonável.
Sinta-se à vontade para deixar comentários ou perguntas abaixo. Boa codificação! ?
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3