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

JKu*_*ald 12 mongoose mongodb node.js express

我有以下模型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);
Run Code Online (Sandbox Code Playgroud)

还有一个额外的Schema用于mongoose.model('settings')存储递增的唯一索引Quote.number我想要建立的增量数.之前每次保存,quotesSchema.pre('save')被称为读取,增加并通过nextQuoteNumberthis.number到分别next()的功能.

但是,.pre('save')Quote其他地方保存时,似乎没有触发整个功能.Mongoose中止保存因为number是必需的但没有定义,并且console.log()我没有写入函数输出任何东西.

vic*_*ohl 33

使用pre('validate')而不是pre('save')设置必填字段的值.Mongoose在保存之前验证文档,因此save如果存在验证错误,则不会调用中间件.将中间件从中切换savevalidate将使您的函数在验证之前设置数字字段.

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();
  });
});
Run Code Online (Sandbox Code Playgroud)


Abd*_*dus 8

对于被 Google 重定向到此处的用户,请确保您在mongoose.model()AFTERmethods和 hooks 声明之后调用。