Typescript 我想在nestjs中实现自定义缓存

Typescript 我想在nestjs中实现自定义缓存,typescript,nestjs,Typescript,Nestjs,nsetjs中的默认缓存机制没有提供足够的灵活性,因为您不能使用@Cache指令或类似的东西来注释个人 我希望能够设置自定义ttl,也不希望缓存每个路由。可能将缓存移动到服务级别是有意义的,但还不确定 只是想知道如何使用nestjs框架以更好的方式做到这一点。只是缓存特定的路由或服务方法。在遇到与您相同的问题后,我最近开始为NestJS开发缓存模块。它可以在npm的@nestjs plus/caching上找到,尽管它还没有准备好使用,但我将在这里分享拦截器的定义。它依赖于mixin模式来接收每

nsetjs中的默认缓存机制没有提供足够的灵活性,因为您不能使用
@Cache
指令或类似的东西来注释个人

我希望能够设置自定义ttl,也不希望缓存每个路由。可能将缓存移动到服务级别是有意义的,但还不确定


只是想知道如何使用nestjs框架以更好的方式做到这一点。只是缓存特定的路由或服务方法。

在遇到与您相同的问题后,我最近开始为NestJS开发缓存模块。它可以在npm的
@nestjs plus/caching
上找到,尽管它还没有准备好使用,但我将在这里分享拦截器的定义。它依赖于mixin模式来接收每个路由选项

从'@nestjs plus/common'导入{makeInjectableMixin};
进口{
执行上下文,
注射
可注射,
内斯特拦截器
}来自“@nestjs/common”;
从'rxjs'导入{forkJoin,Observable,of};
从“rxjs/operators”导入{catchError,map,switchMap};
从“/Cache”导入{Cache,CacheToken};
@可注射()
导出抽象类CachingInterceptor实现NestInterceptor{
受保护的摘要只读选项:CacheOptions;
构造函数(@Inject(CacheToken)私有只读缓存:缓存){}
异步截获(
上下文:ExecutionContext,
呼叫$:可观察
):承诺{
const http=context.switchToHttp();
const-request=http.getRequest();
const key=this.options.getKey(请求);
const cached=wait this.cache.get(key);
如果(缓存!=null){
返回(缓存的);
}
返回调用$.pipe(
开关映射(结果=>{
返回叉连接(
(结果),
this.cache.set(key、result、this.options.ttl)
).pipe(catchError(e=>of(result));
}),
映射(([result,setOp])=>result)
);
}
}
导出接口缓存选项{
ttl:数字;
getKey:(请求)=>字符串;
}
导出常量makeCacheInterceptor=(选项:CacheOptions)=>{
返回makeInjectableMixin('CachingInterceptor')(
类扩展了CachingInterceptor{
受保护的只读选项=选项;
}
);
};
导出接口缓存{
get:(键:字符串)=>承诺;
set:(key:string,data:any,ttl:number)=>Promise;
del:(key:string)=>Promise;
}
export const CacheToken=Symbol('CacheToken');
此模式允许使用不同的TTL或从传入请求中提取缓存密钥的方法在控制器中应用每个路由的缓存

@Get()
@使用拦截器(
makeCacheInterceptor({
getKey:()=>'42'//可以是请求url、查询参数等,
ttl:5,
}),
)
getHello():字符串{
返回此.appService.getHello();
}

这里(以及我正在处理的库)唯一缺少的是一组灵活的缓存实现,如内存、redis、db等。我计划在本周与缓存管理器库集成以填补这一空白(这是Nest用于默认缓存实现的同一个缓存提供程序)。您可以随意使用它作为创建自己的基础,也可以随时关注
@nestjs plus/caching
何时可以使用。本周晚些时候,当我发布一个生产就绪版本时,我将更新这个问题。

在遇到与您相同的问题后,我最近开始为NestJS开发缓存模块。它可以在npm的
@nestjs plus/caching
上找到,尽管它还没有准备好使用,但我将在这里分享拦截器的定义。它依赖于mixin模式来接收每个路由选项

从'@nestjs plus/common'导入{makeInjectableMixin};
进口{
执行上下文,
注射
可注射,
内斯特拦截器
}来自“@nestjs/common”;
从'rxjs'导入{forkJoin,Observable,of};
从“rxjs/operators”导入{catchError,map,switchMap};
从“/Cache”导入{Cache,CacheToken};
@可注射()
导出抽象类CachingInterceptor实现NestInterceptor{
受保护的摘要只读选项:CacheOptions;
构造函数(@Inject(CacheToken)私有只读缓存:缓存){}
异步截获(
上下文:ExecutionContext,
呼叫$:可观察
):承诺{
const http=context.switchToHttp();
const-request=http.getRequest();
const key=this.options.getKey(请求);
const cached=wait this.cache.get(key);
如果(缓存!=null){
返回(缓存的);
}
返回调用$.pipe(
开关映射(结果=>{
返回叉连接(
(结果),
this.cache.set(key、result、this.options.ttl)
).pipe(catchError(e=>of(result));
}),
映射(([result,setOp])=>result)
);
}
}
导出接口缓存选项{
ttl:数字;
getKey:(请求)=>字符串;
}
导出常量makeCacheInterceptor=(选项:CacheOptions)=>{
返回makeInjectableMixin('CachingInterceptor')(
类扩展了CachingInterceptor{
受保护的只读选项=选项;
}
);
};
导出接口缓存{
get:(键:字符串)=>承诺;
set:(key:string,data:any,ttl:number)=>Promise;
del:(key:string)=>Promise;
}
export const CacheToken=Symbol('CacheToken');
此模式允许使用不同的TTL或从传入请求中提取缓存密钥的方法在控制器中应用每个路由的缓存

@Get()
@使用拦截器(
makeCacheInterceptor({
getKey:()=>'42'//可以是请求url、查询参数等,
ttl:5,
}),
)
getHello():字符串{
返回此.appService.getHello();
}
这里(以及我正在处理的库)唯一缺少的是一组灵活的缓存实现,如内存、redis、db等。我计划在本周与缓存管理器库集成以填补这一空白(这是Nest使用的同一个缓存提供程序)