2013-12-11 38 views
1

我想傳遞一個參數預先保存在貓鼬模型像中間件:貓鼬 - 參數傳遞到預先保存 - 在更新不工作保存

subject.save({ user: 'foo', correlationId: 'j3nd75hf...' }, function (err, subject, count) { 
    ... 
}); 

它被傳遞到兩個預先保存中間件

第一:

schema.pre('save', function (next) { 
    // do stuff to model 

    if (arguments.length > 1) 
     next.apply(this, Array.prototype.slice.call(arguments, 1)); 
    else 
     next(); 
}); 

然後:

schema.pre('save', function(next, metadata, callback) { 
    // ... 
    // create history doc with metadata 
    // ... 

    history.save(function(err, doc) { 
     if(err) throw err; 

     if (typeof metadata == 'object') 
      next(callback); 
     else 
      next(); 
    }); 
}); 

它不能保存從db中獲取的現有模型,但它在新創建的模型上工作。

它確實工作,如果我刪除參數。

所以,如果我叫......

subject.save(function (err, subject, count) { 
    ... 
}); 

...它的工作。

看起來回調從來沒有真正的回調。所以也許它假設第一個參數是save()更新的回調。

對於創造,它與傳遞參數

(new models.Subject(subjectInfo)).save({ user: user, correlation_id: correlationId }, function (err, subject, count) { 
    if (err) throw err; 

    ... 
}); 

爲什麼它爲保存()上創建的任何工作思路,但不保存()上更新?

謝謝!

回答

0

model.save()具有1的參數,該參數應該是回調函數。我仍然不完全確定如何設置所有設置,因爲您編寫代碼的樣式有點不合常理。該模型的保存方法只能採取回調,像這樣:

Subject.findOne({ id: id }, function (err, subject) { 
    subject.set('someKey', 'someVal'); 

    // You can only pass one param to the model's save method 
    subject.save(function (err, doc, numAffected) { 

    }); 
}); 

對於更新在貓鼬,我們這樣做:

Subject.update({ id: id}, function (err, numAffected) { 
    // There is no doc to save because update() bypasses Subject.schema 
}); 

此鏈接顯示Model.save()的定義在哪裏。你會注意到它只接受一個參數: https://github.com/LearnBoost/mongoose/blob/3.8.x/lib/model.js#L167

+0

這隻適用於Model.update,findByIdAndUpdate,findOneAndUpdate,findOneAndRemove,findByIdAndRemove。我打電話save()。它也可以工作,調用所有中間件,當傳遞的參數被刪除時 –

+0

嗯......我明白你現在要問什麼。你可以分享你的代碼的「創建」部分嗎?根據貓鼬的說法,建議的意思是保存,創建和更新的想法都有不同的含義。當你說「更新」時,大多數人會想到MongoDB的本地更新命令。這是我的困惑的根源 – srquinn

+0

葉普,我只是在精神上把它分解爲一個CRUD操作。我假設當一個模型/文檔不是新的(!isNew)時,它確實使用了mongodb update()調用,但是使用save()使用了鉤子。對於創建vs更新,save()上的鉤子可能連接不同嗎? –

3

搜索和搜索後,這是我推薦的。

改爲在虛擬域中進行工作。

schema.virtual('modifiedBy').set(function (userId) { 
    if (this.isNew()) { 
    this.createdAt = this.updatedAt = new Date; 
    this.createdBy = this.updatedBy = userId; 
    } else { 
    this.updatedAt = new Date; 
    this.updatedBy = userId; 
    } 
}); 

如果不幫助你,你可能會發現這個其他答案有幫助:https://stackoverflow.com/a/10485979/1483977

或者這個問題的GitHub:

https://github.com/Automattic/mongoose/issues/499

或者this

+0

@bummi,現在試試:-) –

+0

不知道爲什麼downvotes,似乎沒有真正的解決這個問題的明確方案,這是一個有用的答案。 –

+0

@yellowmelon仇恨仇恨:-) –