首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在NestJS中缓存axios NestJS

在NestJS中缓存axios NestJS
EN

Stack Overflow用户
提问于 2020-03-11 08:21:41
回答 1查看 2.4K关注 0票数 4

在我们的应用程序中,我们使用Axios HttpService对第三方api进行一些请求。因为返回的bij数据量很大,所以我们希望缓存响应。在docs中找不到一些如何做到这一点的例子。我目前正在这样做:

代码语言:javascript
运行
复制
@Module({
  imports: [
    HttpModule,
    CacheModule.register({
      ttl: 15,
      store: redisStore,
      host: 'localhost',
      port: 6379,
    })
  ]
})
export class AppModule {}

我在全球注册CacheModule。然后将其导入我需要的模块中。

在使用第三方api的服务中,我创建一个拦截器并缓存响应。非常粗糙,只是为了测试。

代码语言:javascript
运行
复制
constructor(private readonly httpService: HttpService,
              private readonly cache: CacheStore) {
    httpService.axiosRef.interceptors.response.use((response) => {
      cache.set(response.request.url, response.data);
      return response;
    }, error => Promise.reject(error));
  }

首先,这不能运行,因为由于某种原因,CACHE_MANAGER无法导入到CacheModule中。其次,这是一种创建此类拦截器的Node.js方式,而不是NestJS方式。但是,这是向前迈进的一种方式,还是有一种更有效的方式?如果是,那是什么方式?

EN

回答 1

Stack Overflow用户

发布于 2020-08-01 18:49:51

在这里,CacheModule不是正确的工具,因为它意味着缓存内嵌的请求(您的服务接收到的请求,因此它不会再次处理这些请求并返回缓存结果)。

您要做的是缓存传出的请求(您的服务向第三方服务发出的请求)。出于神秘的原因,我也无法在NestJS文档中找到它,但是下面是您可以这样做的方法:

在使用Axios时,可以使用axios-缓存适配器 npm包实现缓存。

代码语言:javascript
运行
复制
npm install --save axios-cache-adapter

然后您需要创建一个适配器(最好是在服务的构造函数中,请参见下面的注释):

代码语言:javascript
运行
复制
const cache = setupCache({
  maxAge: 3600 * 1000, // 60 minutes
});

并将此适配器作为AxiosRequestConfig的一部分提供给您的请求:

代码语言:javascript
运行
复制
const config = {
  adapter: this.cache.adapter,
};
this.httpService.get( url, config );

您现在应该可以进行一些缓存了!

重要注释:

  • 应该只在GET请求上使用缓存,而且很可能会起作用。
  • 只使用setupCache函数一次(例如在服务的构造函数中);如果您为每个请求创建一个缓存对象,则该缓存每次都将为空,从而使它的用途失效。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60631794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档