Mongoose .pre('save')不会触发

我有以下模型mongoose.model('quotes')

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var quotesSchema = new Schema({ created: { type: String, default: moment().format() }, type: { type: Number, default: 0 }, number: { type: Number, required: true }, title: { type: String, required: true, trim: true}, background: { type: String, required: true }, points: { type: Number, default: 1 }, status: { type: Number, default: 0 }, owner: { type: String, default: "anon" } }); var settingsSchema = new Schema({ nextQuoteNumber: { type: Number, default: 1 } }); // Save Setting Model earlier to use it below mongoose.model('settings', settingsSchema); var Setting = mongoose.model('settings'); quotesSchema.pre('save', true, function(next) { Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) { if (err) { console.log(err) }; this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next next(); }); }); mongoose.model('quotes', quotesSchema); 

有一个额外的架构mongoose.model('settings')存储一个递增的唯一索引Quote.number即时通讯尝试build立一个递增的数字。 在每次保存之前, quotesSchema.pre('save')来读取,增加并传递nextQuoteNumber作为this.number到各自的next()函数。

然而,这整个.pre('save')函数似乎不会触发时保存Quote在其他地方。 mongoose中止保存,因为number是必需的,但没有定义和没有console.log()我写入该函数输出任何东西。

使用pre('validate')而不是pre('save')来设置所需字段的值。 Mongoose在保存之前validation文档,因此如果存在validation错误,则不会调用save中间件。 将中间件从save切换到validate将使您的函数在validation之前设置数字字段。

 quotesSchema.pre('validate', true, function(next) { Setting.findByIdAndUpdate(currentSettingsId, { $inc: { nextQuoteNumber: 1 } }, function (err, settings) { if (err) { console.log(err) }; this.number = settings.nextQuoteNumber - 1; // substract 1 because I need the 'current' sequence number, not the next next(); }); });