Как сохранить кеш CacheInterceptor при ошибке в Nestjs

116
15

В nestjs я могу украсить @UseInterceptors(CacheInterceptor) моего контроллера, чтобы включить кеширование, которое работает хорошо.

  getMyData() {
return this.myService.getData(params).pipe(
map(x => {
return {
val1: x.val1,
val2: x.val2,
};
}),
); // if error want to keep the current cache
}

Тем не менее, есть вариант использования, если возникает ошибка, вы хотите сохранить текущий кэш, в противном случае вы получаете исключение, и метод контроллера возвращает ошибку. Итак, как бы вы перехватили ошибку и вместо нее вернули текущий кеш?

Согласно исходному коду CacheInterceptor, я не могу четко понять, возможно ли это или нет

  async intercept(
context: ExecutionContext,
call$: Observable<any>,
): Promise<Observable<any>> {
const key = this.trackBy(context);
if (!key) {
return call$;
}
try {
const value = await this.cacheManager.get(key);
if (value) {
return of(value);
}
return call$.pipe(tap(response => this.cacheManager.set(key, response)));
} catch {
return call$;
}
}

Есть идеи?

спросил(а) 2019-01-28T11:57:00+03:00 1 год, 9 месяцев назад
1
Решение
107

Важно понимать, что в перехватчиках вызов $ observable представляет будущее значение вашего метода/обработчика контроллера. Как намекает Ким Керн, вы можете видеть, что во фрагменте, который вы указали, если в кеше есть значение, перехватчик немедленно возвращает его, используя of(value) и вызов $ не используется ни для чего.

Единственный способ получить ошибку от контроллера - это если в кеше не было значения для этого ключа.

ответил(а) 2019-01-28T17:33:00+03:00 1 год, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема