缓存是提高应用程序性能和可扩展性的基本技术。在 Nest.js 中,可以使用内置的缓存管理器无缝集成缓存。在本文中,我们将探讨如何创建自定义 @Cacheable 装饰器来简化 Nest.js 服务或控制器中的缓存。
虽然 Nest.js 提供了强大的开箱即用的缓存机制,但直接在方法中应用缓存逻辑可能会使您的代码变得混乱。自定义装饰器抽象了此逻辑,使您的代码更干净且更易于维护。
让我们首先创建 @Cacheable 装饰器,我们将使用它来缓存方法的结果。
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; }; }
以下是如何将 @Cacheable 装饰器应用到服务中的方法:
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() }
要在应用程序中使用缓存管理器,您需要在模块中注册它:
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 {}
确保将缓存管理器注入到使用 @Cacheable 装饰器的任何服务或控制器中:
import { Injectable } from '@nestjs/common'; import { Cache } from 'cache-manager'; @Injectable() export class SettingsService { constructor(private readonly cacheManager: Cache) {} // ... your methods }
通过创建自定义 @Cacheable 装饰器,您可以保持方法干净并专注于核心逻辑,将缓存问题留给装饰器。这种方法增强了代码的可读性和可维护性,使您的 Nest.js 应用程序更加高效和可扩展。
请随时在下面留下评论或问题。快乐编码! ?
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3