From 1b807ed6175760fa33ad9077d70be2046f0438cb Mon Sep 17 00:00:00 2001 From: Justin D'Errico Date: Fri, 22 Apr 2022 15:46:25 -0400 Subject: [PATCH 1/2] fix: Catch @Cache & @CacheOnInterval errors --- src/cache/cache-on-interval.service.ts | 19 ++++++++++++++----- src/cache/cache.service.ts | 17 ++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/cache/cache-on-interval.service.ts b/src/cache/cache-on-interval.service.ts index c7f377941..2bd64b393 100644 --- a/src/cache/cache-on-interval.service.ts +++ b/src/cache/cache-on-interval.service.ts @@ -49,6 +49,7 @@ export class CacheOnIntervalService implements OnModuleInit, OnModuleDestroy { } private registerCache(instance: any, methodName: string) { + const logger = this.logger; const methodRef = instance[methodName]; const cacheKey: CacheOnIntervalOptions['key'] = this.reflector.get(CACHE_ON_INTERVAL_KEY, methodRef); const cacheTimeout: CacheOnIntervalOptions['timeout'] = this.reflector.get(CACHE_ON_INTERVAL_TIMEOUT, methodRef); @@ -74,16 +75,24 @@ export class CacheOnIntervalService implements OnModuleInit, OnModuleDestroy { if (cachedValue) { return cachedValue; } else { - const liveData = await methodRef.apply(instance, args); - await cacheManager.set(cacheKey, liveData, { ttl }); - return liveData; + try { + const liveData = await methodRef.apply(instance, args); + await cacheManager.set(cacheKey, liveData, { ttl }); + return liveData; + } catch (e) { + logger.error(`@CacheOnInterval error for ${instance.name}#${methodName}`, e); + } } }; // Save the interval const interval = setInterval(async () => { - const liveData = await methodRef.apply(instance); - await cacheManager.set(cacheKey, liveData, { ttl }); + try { + const liveData = await methodRef.apply(instance); + await cacheManager.set(cacheKey, liveData, { ttl }); + } catch (e) { + logger.error(`@CacheOnInterval error for ${instance.constructor.name}#${methodName}`, e); + } }, cacheTimeout); this.intervals.push(interval); } diff --git a/src/cache/cache.service.ts b/src/cache/cache.service.ts index a6ce8066f..274a1d8fd 100644 --- a/src/cache/cache.service.ts +++ b/src/cache/cache.service.ts @@ -1,4 +1,4 @@ -import { CACHE_MANAGER, Inject, Injectable, OnModuleInit } from '@nestjs/common'; +import { CACHE_MANAGER, Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core'; import { Cache } from 'cache-manager'; import { isNil } from 'lodash'; @@ -7,6 +7,8 @@ import { CacheOptions, CACHE_KEY, CACHE_TTL } from './cache.decorator'; @Injectable() export class CacheService implements OnModuleInit { + private logger = new Logger(CacheService.name); + constructor( @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, @Inject(DiscoveryService) private readonly discoveryService: DiscoveryService, @@ -39,6 +41,7 @@ export class CacheService implements OnModuleInit { } private registerCache(instance: any, methodName: string) { + const logger = this.logger; const methodRef = instance[methodName]; const rawCacheKey: CacheOptions['key'] = this.reflector.get(CACHE_KEY, methodRef); const rawCacheTtl: CacheOptions['ttl'] = this.reflector.get(CACHE_TTL, methodRef); @@ -59,10 +62,14 @@ export class CacheService implements OnModuleInit { if (cachedValue) { return cachedValue; } else { - const cacheTtl = extractTtl(rawCacheTtl, args); - const liveData = await methodRef.apply(this, args); - await cacheManager.set(cacheKey, liveData, { ttl: cacheTtl }); - return liveData; + try { + const cacheTtl = extractTtl(rawCacheTtl, args); + const liveData = await methodRef.apply(this, args); + await cacheManager.set(cacheKey, liveData, { ttl: cacheTtl }); + return liveData; + } catch (e) { + logger.error(`@Cache error for ${instance.constructor.name}#${methodName}`, e); + } } }; } From ab817c59ed18b4bf4105fa6afda52e28d806bcd7 Mon Sep 17 00:00:00 2001 From: Justin D'Errico Date: Fri, 22 Apr 2022 15:47:44 -0400 Subject: [PATCH 2/2] fix --- src/cache/cache-on-interval.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cache/cache-on-interval.service.ts b/src/cache/cache-on-interval.service.ts index 2bd64b393..4c329c786 100644 --- a/src/cache/cache-on-interval.service.ts +++ b/src/cache/cache-on-interval.service.ts @@ -80,7 +80,7 @@ export class CacheOnIntervalService implements OnModuleInit, OnModuleDestroy { await cacheManager.set(cacheKey, liveData, { ttl }); return liveData; } catch (e) { - logger.error(`@CacheOnInterval error for ${instance.name}#${methodName}`, e); + logger.error(`@CacheOnInterval error for ${instance.constructor.name}#${methodName}`, e); } } };