gpt4 book ai didi

node.js - 缓存服务方法的返回值

转载 作者:行者123 更新时间:2023-12-04 00:56:18 26 4
gpt4 key购买 nike

我正在使用nestjs,并且刚刚安装了 cache-manager 模块,并且正在尝试缓存来自服务调用的响应。

我在一个示例模块(sample.module.ts)中注册了缓存模块:

import { CacheInterceptor, CacheModule, Module } from '@nestjs/common';
import { SampleService } from './sample.service';
import { APP_INTERCEPTOR } from '@nestjs/core';
import * as redisStore from 'cache-manager-redis-store';


@Module({
imports: [
CacheModule.register({
ttl: 10,
store: redisStore,
host: 'localhost',
port: 6379,
}),
],
providers: [
SampleService,
{
provide: APP_INTERCEPTOR,
useClass: CacheInterceptor,
}
],
exports: [SampleService],
})
export class SampleModule {}

然后在我的服务中(sample.service.ts):

@Injectable()
export class SampleService {
@UseInterceptors(CacheInterceptor)
@CacheKey('findAll')
async findAll() {
// Make external API call
}
}

查看 redis,我可以看到服务方法调用没有缓存任何内容。如果我对 Controller 使用相同的方法,那么一切正常,我可以在我的 redis 数据库中看到缓存的条目。我认为没有办法在nestjs中缓存单个服务方法调用。

阅读documentation看来我只能对 Controller 、微服务和 websockets 使用这种方法,而不是普通服务?

最佳答案

正确,不可能将缓存以与 Controller 相同的方式用于服务。

这是因为魔法发生在 CacheInterceptorInterceptors只能在Controllers中使用。


但是,您可以将 cacheManager 注入(inject)到您的服务中并直接使用它:

export class SampleService {

constructor(@Inject(CACHE_MANAGER) protected readonly cacheManager) {}

findAll() {
const value = await this.cacheManager.get(key)
if (value) {
return value
}

const respone = // ...
this.cacheManager.set(key, response, ttl)
return response
}

关于node.js - 缓存服务方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62279826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com