您可以配置NestJS缓存TTL每个端点吗?

时间:2019-10-09 02:37:05

标签: javascript node.js caching nestjs

我目前正在按照文档https://docs.nestjs.com/techniques/caching

中所述使用NestJS缓存机制

使用此代码,我可以使用以下内容自定义整个模块的缓存:

CacheModule.register({
  ttl: 5, // seconds
  max: 10, // maximum number of items in cache
});

但是,我想某些端点要比其他端点缓存更长的时间。 (例如长期运行的操作不会像其他操作那样频繁更改)

这里描述了类似的内容:https://github.com/nestjs/nest/issues/695,但看起来它是封闭的,并未真正解决整个问题。

我在想类似的东西:

@Cache({ ttl: 600 })
@Get()
findAll(): string[] {
  return service.longRunningOperation();
}

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

尚不支持由decorator控制ttl缓存。 github中有一个feature request,可以在以后的版本中添加它。

但是,您可以使用更详细的方法来处理它。将cache-manager对象注入到控制器的构造函数中,并在每个所需的路由上使用'wrap'函数:

create table metadata
(
    id int
    , property_en sysname 
    , desc_en varchar(500) 
)

insert metadata values
(1, 'sex', 'Sex. 1 denotes male, 2 denotes female')
, (2, 'year', 'The year of the event record')

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'EXEC sys.sp_addextendedproperty @name=N''' + d.property_en + ''', @value=N''' + d.desc_en + ''', @level0type=N''SCHEMA'', @level0name=N''' + s.name + ''', @level1type=N''TABLE'', @level1name=N''' + t.name + ''', @level2type=N''COLUMN'', @level2name=N''' + d.property_en + ''';'
from metadata d
join sys.columns c on c.name = d.property_en
join sys.tables t on t.object_id = c.object_id
join sys.schemas s on s.schema_id = t.schema_id

select @SQL
--once you are comfortable that the dynamic sql works uncomment the line below.
--exec sp_executesql @SQL

答案 1 :(得分:0)

您不能通过使用cacheManager来这样做。 您可以使用另一种方法,可以使用utils-decorators lib(npm install --save utils-decorators)并利用AsyncMemoize装饰器。然后,您只需要向控制器功能添加装饰器即可:

import {memoizeAsync} from 'utils-decorators';

class Controller {


 @Get('endpointA')
 @memoizeAsync(60 * 60 * 1000 * 12)
 endpointA() {
 }

 @Get('endpointB')
 @memoizeAsync(60 * 60 * 1000 * 24)
 endpointB() {
 }
}

答案 2 :(得分:0)

您可以使用模块的通用ttl值注册Cache模块 然后,在控制器中,同时使用'@nestjs/common'包中的类CacheInterceptor和CacheTTL装饰器,如下所示

@Get()
@CacheTTL(100) 
@UseInterceptors(CacheInterceptor)
findAll(): string[] {
  return service.longRunningOperation();
}

CacheTTL Decorator中的值将覆盖缓存的默认过期时间值