在 NestJS 中缓存 axios httpService

Posted

技术标签:

【中文标题】在 NestJS 中缓存 axios httpService【英文标题】:Caching the axios httpService in NestJS 【发布时间】:2020-06-23 04:29:17 【问题描述】:

在我们的应用程序中,我们使用 Axios HttpService 向第三方 api 发出一些请求。 因为 bij de api 返回的数据量很大,我们想缓存响应。 在文档中无法找到一些如何执行此操作的示例。 我目前这样做如下:

@Module(
  imports: [
    HttpModule,
    CacheModule.register(
      ttl: 15,
      store: redisStore,
      host: 'localhost',
      port: 6379,
    )
  ]
)
export class AppModule 

我在全局范围内注册了 CacheModule。 然后将其导入我需要的模块中。

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

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 方式。 但这是一种前进的方式,还是有更有效的方式,如果是,那是什么方式?

【问题讨论】:

【参考方案1】:

CacheModule 在这里不是正确的工具,因为它意味着缓存 ingoing 请求(您的服务收到的请求,因此它不会再次处理它们并发回缓存结果) .

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


当您使用 Axios 时,您可以使用 axios-cache-adapter npm 包实现缓存。

npm install --save axios-cache-adapter

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

const cache = setupCache(
  maxAge: 3600 * 1000, // 60 minutes
);

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

const config = 
  adapter: this.cache.adapter,
;
this.httpService.get( url, config );

你现在应该擅长一些缓存了!

重要提示:

应该使用缓存,并且可能只在 GET 请求上起作用 setupCache 函数只使用一次(例如在您的服务的构造函数中);如果你为每个请求创建一个缓存对象,这个缓存每次都是空的,违背了它的目的

【讨论】:

以上是关于在 NestJS 中缓存 axios httpService的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestJS 中记录所有 Axios 外部 http 请求

Nestjs 使用 axios

如何使用@nestjs/axios 发出 api Get 请求

NestJS:记录来自 HttpService 调用的请求/响应?

NestJS + Angular 项目抛出未找到模块:错误:无法解析“缓存管理器”

NestJS:每个模块导入的 HttpModule 新实例