Вам следует рассмотреть возможность использования Interceptor
вместо пользовательского декоратора, поскольку они запускаются ранее в конвейере Nest и поддерживают внедрение зависимостей по умолчанию.
Однако, поскольку вы хотите как передать значения (для тайм-аута кэша), так и разрешить зависимости, вам придется использовать шаблон mixin
.
import {
ExecutionContext,
Injectable,
mixin,
NestInterceptor,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { TestService } from './test/test.service';
@Injectable()
export abstract class CacheInterceptor implements NestInterceptor {
protected abstract readonly cacheDuration: number;
constructor(private readonly testService: TestService) {}
intercept(
context: ExecutionContext,
call$: Observable<any>,
): Observable<any> {
// Whatever your logic needs to be
return call$;
}
}
export const makeCacheInterceptor = (cacheDuration: number) =>
mixin(
// tslint:disable-next-line:max-classes-per-file
class extends CacheInterceptor {
protected readonly cacheDuration = cacheDuration;
},
);
Тогда вы будетев состоянии применить Перехватчик к вашему обработчику аналогичным образом:
@Injectable()
class UserService{
@UseInterceptors(makeCacheInterceptor(1000))
async getUser(id:string):Promise<User>{
// Make a call to db to get all Users
}
}