在我们的应用程序中,我们使用Axios HttpService对第三方api进行一些请求。因为返回的bij数据量很大,所以我们希望缓存响应。在docs中找不到一些如何做到这一点的例子。我目前正在这样做:
@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方式。但是,这是向前迈进的一种方式,还是有一种更有效的方式?如果是,那是什么方式?
发布于 2020-08-01 18:49:51
在这里,CacheModule不是正确的工具,因为它意味着缓存内嵌的请求(您的服务接收到的请求,因此它不会再次处理这些请求并返回缓存结果)。
您要做的是缓存传出的请求(您的服务向第三方服务发出的请求)。出于神秘的原因,我也无法在NestJS文档中找到它,但是下面是您可以这样做的方法:
在使用Axios时,可以使用axios-缓存适配器 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 );您现在应该可以进行一些缓存了!
重要注释:
https://stackoverflow.com/questions/60631794
复制相似问题