【问题标题】:How to use generateFunc in server.cache() in Hapi.js?如何在 Hapi.js 的 server.cache() 中使用 generateFunc?
【发布时间】:2016-02-06 17:14:23
【问题描述】:

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 的回调和 generateFunc 的回调中定义 ttl?
  • 我是否仍然在 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 - 当带有签名 function(err, value, ttl) 的新项目返回时调用的方法,其中:
    • err - 错误情况。
    • value - 生成的新值。
    • ttl - 以毫秒为单位的缓存 ttl 值。设置为 0 以跳过缓存中的存储。默认为缓存全局策略。

get(id,回调),其中:

  • id - 唯一的项目标识符。

  • 回调,函数(错误、值、缓存、报告),其中:

    • err - 遇到的任何错误。
    • value - 获取或生成的值。
    • cached - 如果在缓存中未找到有效项目或具有以下键的对象,则为 null:

      • item - 缓存的值。
      • stored - 项目存储在缓存中的时间戳。
      • ttl - 记录的缓存 ttl 值。
      • isStale - 如果项目已过时,则为 true。

设置(id、值、ttl、回调),其中:

  • id - 唯一的项目标识符
  • value - 要存储的字符串或对象值。
  • ttl - 以毫秒为单位的生存时间值,在此之后项目会自动从缓存中删除(或标记为无效)。
  • callback - 带有签名 function(err) 的函数。

【问题讨论】:

    标签: javascript node.js caching callback hapijs


    【解决方案1】:

    您的问题的答案可以在文档、资源和通过实验中找到: http://hapijs.com/tutorials/caching
    https://github.com/hapijs/catbox

    1. 你调用generateFunc的回调,然后catbox处理(err, value),然后它调用get的回调。
    2. ttl “默认为缓存全局策略”。我猜expiresIn 就是那个政策。
    3. 不要从generateFunc调用set,通过next将值传递给catbox,它会为你存储。
    4. 有几种访问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 */}
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2017-04-11
      • 2017-11-07
      • 2019-12-30
      • 1970-01-01
      • 2015-10-04
      相关资源
      最近更新 更多