2012-09-07 68 views
0

的方案如下貓鼬中間件發出

場景#1

someSchema.pre('save', function(next){ 
    asyncFunction(function(){ 
    this.sub.value = 'something' 
    next() 
    }) 
}) 

這將失敗,因爲這改變背景和現在代表asyncFunction,所以我不能在函數中修改輸入的數據。它配備了與this.sub沒有定義

場景#2錯誤的基礎上,從鉤-JS

some.Schema.pre('save', function(next){ 
    asyncFunction(function(){ 
    next('something') 
    }); 
}); 
some.Schema.pre('save', function(next, value){ 
    this.sub.value=value 
    next() 
}) 

這工作,在迄今爲它修改值和信息mongodb方面很好,但它只是掛起,在保存文檔後永遠不會繼續。

我做錯了什麼?有沒有更好的方法來做到這一點?或者這是一個錯誤

場景#3原故障,但現在似乎工作

someSchema.pre('save', function(next){ 
    x = this 
    asyncFunction(function(){ 
    x.sub.value = 'something' 
    next() 
    }) 
}) 

儘管如此,我仍然好奇,爲什麼場景#2沒有工作。

回答

2

在第一種情況下,您需要捕獲你想提供給這樣的回調原this背景:

someSchema.pre('save', function(next){ 
    var self = this; 
    asyncFunction(function(){ 
    self.sub.value = 'something' 
    next() 
    }) 
}) 

在第二種情況下,我認爲你的雜草是有點過。您不能通過參數將值從一箇中間件函數傳遞到下一個。當您使用middleware的兩個參數回調版本時,您將其標記爲並行中間件,而第二個參數是done函數,該函數在回調完成其處理後必須調用。

+0

也嘗試過,最初它不起作用。由於某種奇怪的原因,它正在工作。 –

+0

場景#2基於https://github.com/bnoguchi/hooks-js,這是中間件所基於的,他們確實提到可以傳遞變量。事實上它似乎通過了變量,但是它在執行後不會繼續。仍然對此感到好奇。 –