其實this.model
不會爲(預先保存鉤/中間件)pre.('save'
但this.model
會爲update
,findOneAndUpdate
預掛鉤工作..等
爲pre.('save'
掛鉤工作,你需要使用this.constructor
代替this.model
like:this.constructor.count
或this.constructor.findOne
等
在我的例子假設創建模式爲國家
,所以你可以用這樣的波紋管:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var CountrySchema = new Schema({
name: String,
//....
});
CountrySchema.pre('save', function(next) {
var self = this;
self.constructor.count(function(err, data) {
if(err){
return next(err);
}
// if no error do something as you need and return callback next() without error
console.log('pre save count==', data);
return next();
});
});
CountrySchema.pre('update', function (next) {
var self = this;
self.model.count(function(err, data) {
if(err){
return next(err);
}
// if no error do something as you need and return callback next() without error
console.log('pre update count===', data);
return next();
});
});
module.exports = mongoose.model('Country', CountrySchema);
OR
可以使用mongoose.models['modelName']
像:mongoose.models['Country'].count()
例如
CountrySchema.pre('save', function(next) {
mongoose.models['Country'].count(function(err, data) {
if(err){
return next(err);
}
console.log('pre save count==', data);
return next();
});
});
CountrySchema.pre('update', function (next) {
mongoose.models['Country'].count(function(err, data) {
if(err){
return next(err);
}
console.log('pre update count===', data);
return next();
});
});
N.B:爲什麼this.model
不能在save
的預掛鉤中工作?
Middleware(也稱爲前後鉤子)是在執行異步功能期間通過控制傳遞的函數。
在貓鼬有2種類型的中間件:
- 文獻中間件和
- 查詢中間件
文獻中間件被支持函數。
init
,validate
,save
,remove
查詢中間件被支持函數。
count
,find
,findOne
,findOneAndRemove
,findOneAndUpdate
,insertMany
,update
在貓鼬查詢中間件this.model
是生成由貓鼬定義模型/實例。在這個中間件this
返回所有實例變量,由貓鼬定義。
,其中在文檔中間件this
回報所有領域您通過貓鼬所以this.model
不是你定義的屬性定義不是。對於上面的例子,我有name
屬性,所以你可以通過this.name
得到那個將顯示你的請求值。但是,當使用this.contructor
時,您將返回實例變量,這些變量由貓鼬定義,如返回Model
實例變量。
只要可能,我寧願堅持'this'。感謝您指向'this.constructor'。實際上,'count'應該是靜態方法,所以這是有道理的。我想這可能的解釋是它是'this.model'突出,它看起來像是Model的構造函數,而不是一個實例(屬性名稱中的錯誤情況不起作用)。 – estus
添加了一些解釋,據我所知你可以看到@estus –
非常感謝,這是相當詳盡的答案。 – estus