2013-02-04 60 views
10

在我的貓鼬模型中,我有一些依賴於時間的stats。我的想法是在模型加載完成後立即添加middleware以更改這些統計數據。在貓鼬負載後更改模型值

不幸的是,關於post掛鉤的文檔有點缺乏清晰度。好像我可以用這樣的鉤子:

schema.post('init', function(doc) { 
    doc.foo = 'bar'; 
    return doc; 
}); 

他們唯一的例子涉及console.log -outputs。它不會以任何方式解釋是否必須返回doc,或者根本不可能修改後Hook(因爲它不是異步的,對於複雜的想法可能沒什麼用處)。

如果'init'pre是不自動更新負荷模型的正確途徑,又是什麼?

回答

16

這就是我們如何更新負荷模型,以異步方式運行:

schema.pre('init', function(next, data) { 
    data.property = data.property || 'someDefault'; 
    next(); 
}); 

預初始化是特殊的,其他的鉤有一個稍微不同的簽名,例如預先保存:

schema.pre('save', function(next) { 
    this.accessed_ts = Date.now(); 
    next(); 
}); 
+2

所以pre-init實際上是在數據加載之後?該文件不在'this'上下文中? – Lanbo

+3

預先初始化是在數據加載之後,但是*之前*文檔是用這些數據(afaik)水化的。由於數據尚未放置在文檔中,因此存在「this」上下文(它仍然是doc),但它將是空的(iirc)。 – hunterloftis

+0

我希望文檔解釋這一點。 – binki