如下图所示,如何使用generateFunc?
server.cache({
expiresIn: 1000*60*60,
segment: 'test',
generateFunc: function(key,next){}
});
我知道generateFunc用于生成新的缓存项,如果在调用get()时未在缓存中找到一个缓存项-直接从api文档开始。但是,我仍然不确定如何将get()与generateFunc()结合使用
如果我将get()与generateFunc()一起使用,则是get的回调generateFunc的回调(名为next())吗?
如果我在server.cache中定义了expiresIn,是否必须在get的回调中定义ttl和generateFunc的回调中?
仍然在generateFunc的回调(next())中使用set方法来缓存项目吗?
如果我在类对象中使用以下内容,如何从generateFunc内的构造函数中引用类变量?
class Test {
constructor(){
this.testVar = 'hello';
}
register(server) {
this.server = server;
this.testCache = server.cache({
expiresIn: 1000*60*60,
segment: 'test',
generateFunc: function(key,next){}
});
}
}
我不明白流程。我需要一个带有说明的简单示例大纲,但是找不到任何好的资源。
从文档中:
generateFunc(id,next)-如果在调用get()时在缓存中未找到新的缓存项,则该函数用于生成新的缓存项。
id-提供给get()方法的id字符串或对象。
next-使用签名函数(err,value,ttl)返回新项时调用的方法,其中:
err-错误条件。
value-生成的新值。
ttl-缓存ttl值(以毫秒为单位)。设置为0以跳过存储在缓存中。默认为缓存全局策略。
get(id,callback),其中:
id-唯一商品标识符。
回调,函数(错误,值,已缓存,报告),其中:
err-遇到的任何错误。
value-获取或生成的值。
高速缓存-如果在高速缓存中找不到有效的项目或具有以下键的对象,则为null:
item-缓存的值。
已存储-将项目存储在缓存中的时间戳。
ttl-记录的缓存ttl值。
isStale-如果该项是陈旧的,则为true。
set(id,value,ttl,callback),其中:
id-唯一商品标识符
value-要存储的字符串或对象值。
ttl-生存时间值(以毫秒为单位),在此值之后,该项目会自动从缓存中删除(或标记为无效)。
callback-具有签名函数(err)的函数。
最佳答案
您的问题的答案可以在文档,源中以及通过实验找到:
http://hapijs.com/tutorials/caching
https://github.com/hapijs/catbox
调用generateFunc
的回调,然后catbox处理(err, value)
,然后调用get
的回调。ttl
“默认为缓存全局策略”。我想expiresIn
是该政策。
不要从set
调用generateFunc
,而是通过next
将值传递给catbox,它将为您存储它。
有几种访问this
的方法。我还没有测试代码:
class Test {
constructor(){
this.testVar = 'hello';
}
register(server) {
this.server = server;
const self = this;
this.testCache = server.cache({
expiresIn: 1000*60*60,
segment: 'test',
// Old trick
generateFunc: function(key,next){ console.log(self.testVar); },
// or new trick
generateFunc: (key,next) => console.log(this.testVar) // Read about arrow functions
// or
generateFunc: this._cacheGenerateFunc.bind(this),
});
}
_cacheGenerateFunc(id, next) {/* Your code */}
}
关于javascript - 如何在Hapi.js的server.cache()中使用generateFunc?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33551854/