快取是提高應用程式效能和可擴展性的基本技術。在 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