猫鼬.pre('save')不触发 [英] Mongoose .pre('save') does not trigger
问题描述
我为 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
的递增编号.在每次保存之前,调用 quotesSchema.pre('save')
分别读取,增加和传递 nextQuoteNumber
作为 this.number
到 next()
函数.
There is an additional Schema for mongoose.model('settings')
to store an incrementing number for the incrementing unique index Quote.number
im trying to establish. Before each save, quotesSchema.pre('save')
is called to read, increase and pass the nextQuoteNumber
as this.number
to the respectively next()
function.
但是,在其他地方保存 Quote
时,似乎不会触发整个 .pre('save')
函数.猫鼬中止了保存,因为需要 number
,但没有定义,并且没有 console.log()
写入函数,因此不会输出任何内容.
However, this entire .pre('save')
function does not seem to trigger when saving a Quote
elsewhere. Mongoose aborts the save since number
is required but not defined and no console.log()
i write into the function ever outputs anything.
推荐答案
使用 pre('validate')
代替 pre('save')
来设置值用于必填字段.猫鼬在保存之前先对文档进行验证,因此,如果存在验证错误,则不会调用您的 save
中间件.将中间件从 save
转换为 validate
,将使您的函数在验证之前设置number字段.
Use pre('validate')
instead of pre('save')
to set the value for the required field. Mongoose validates documents before saving, therefore your save
middleware won't be called if there are validation errors. Switching the middleware from save
to validate
will make your function set the number field before it is validated.
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();
});
});
这篇关于猫鼬.pre('save')不触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!