1

我目前正在使用 NestJS 的缓存管理器模块,我想知道为什么我不能像这样获得 NodeRedis 客户端:

 constructor(
    @Inject(CACHE_MANAGER) private cacheManager: Cache,
  ) {
    cacheManager.store.getClient();
  }

我收到此错误:

ERROR in [...].controller.ts:24:24
TS2339: Property 'getClient' does not exist on type 'Store'.
    22 |     @Inject(CACHE_MANAGER) private cacheManager: Cache,
    23 |   ) {
  > 24 |     cacheManager.store.getClient();
       |                        ^^^^^^^^^
    25 |   }

我在注册 CacheModule 时确实配置了 cache-manager-redis-store,然后我想我可以获得客户端。

4

1 回答 1

3

tl;dr 似乎cache-manager-redis-storeTypeScript 不正确支持该类型,因为该RedisCache类型是私有的并且无法导入。

作为一种解决方法,您可以将私有类型复制到您自己的文件中:

import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
import { Store } from 'cache-manager';
import Redis from 'redis';

interface RedisCache extends Cache {
  store: RedisStore;
}

interface RedisStore extends Store {
  name: 'redis';
  getClient: () => Redis.RedisClient;
  isCacheableValue: (value: any) => boolean;
}

@Injectable()
export class CacheService {
  constructor(
    @Inject(CACHE_MANAGER)
    private cacheManager: RedisCache,
  ) {
    cacheManager.store.getClient();
  }
}

深潜

看起来CACHE_MANAGERNestJS 提供的 是由createCacheManager创建的,它导入 npm 包cache-manager,然后caching使用您提供的 store 包调用其功能。

我认为Cache您使用的类型是从cache-manager. 该类型在此处定义,并且包含Store在同一文件中的此处。getClient不是该接口上的方法方法,因此错误消息是正确的。

但是,由于您使用的是商店的外部包,因此它所caching-manager了解的内容更多。查看 的类型cache-manager-redis-store,您可以看到有一个类型RedisStore扩展Store并包含getClient

cacheManager技术上讲,getClient自从您使用 redis 存储包配置它以来,您需要将cacheManager变量的类型设置RedisCache为 TypeScript 以允许它。

根据 的 绝对类型 类型,如果您将包导入为cache-manager-redis-store,您的类型似乎应该是,但似乎存在问题,因为未导出该命名空间。redisStore.CacheManagerRedisStore.RedisCacheredisStoreCacheManagerRedisStore

在 repo 上有一个关于这个问题的问题,并且有一个问题要求 TypeScript 支持。目前,TypeScript 似乎没有正确支持这个包。

于 2021-06-25T03:00:08.960 回答