2015-05-08 111 views
0

我想弄清楚我的緩存是如何工作的,因此想要將它實現到我的模型的鉤子中。這是我迄今爲止所實現的,我可以看到它正在設置並正確獲取緩存。從續集鉤返回不同結果

hooks: { 
     beforeFind: function(opts,fn) { 
      cache.get(this.getTableName() + ':' + opts.where.id, function(err, result) { 
       if (result) { 
        return fn(null, result); 
       } 

       return fn(null, opts); 
      }); 
     }, 
     afterFind: function(result, options, fn) { 
      cache.set(this.getTableName() + ':' + result.getDataValue('id'), result, function() { 
       return fn(null, result); 
      }); 
     }, 
} 

問題是,在緩存命中後,它仍在執行數據庫查詢並從數據庫返回結果。

有人能告訴我如何從緩存中返回結果,而不是在緩存命中的情況下執行數據庫查詢?

回答

1

讓我們來看看代碼findAll(因爲它是要求所有發現)。你可以看到,它會返回Promise,它首先執行鉤子,然後在塊中有你查詢。這就是爲什麼你不能以這種方式實現緩存。在這個issue有一個關於如何sequelize需要實現插件系統(特別是緩存)的熱門討論。

你能知道什麼?看看這個lib,其中Cacher對象是通過模型實現的。