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(); }); });