2015-05-09 10 views
5

Ich habe folgendes Modell für mongoose.model('quotes'):Mongoose .pre (‚speichern‘) nicht auslösen

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

Es gibt ein zusätzliches Schema für mongoose.model('settings') eine fortlaufende Nummer für das Erhöhen eindeutige Index Quote.number im speichern versuchen, Gründen. Vor jedem Speichern wird quotesSchema.pre('save') aufgerufen, um zu lesen, zu erhöhen und die nextQuoteNumber als this.number an die jeweils next() Funktion zu übergeben.

Allerdings scheint diese gesamte .pre('save') Funktion nicht zu aktivieren, wenn Sie eine Quote an anderer Stelle speichern. Mongoose bricht den Speicher ab, da number erforderlich ist, aber nicht definiert ist und keine console.log() ich schreibe in die Funktion überhaupt nichts aus.

Antwort

15

Verwenden Sie pre('validate') anstelle von pre('save'), um den Wert für das erforderliche Feld festzulegen. Mongoose validiert Dokumente vor dem Speichern, daher wird Ihre save Middleware nicht aufgerufen, wenn Validierungsfehler vorliegen. Wenn Sie die Middleware von save auf validate umschalten, wird Ihre Funktion das Zahlenfeld vor der Validierung setzen.

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

Danke. Am Ende habe ich nur die Aktion in meinem 'pre ('save')' gemacht, wann immer ich wirklich gespart habe, da es nicht so oft passiert ist. Ich nehme an, dass meine Variante auch funktioniert hätte, wenn ich 'required: true' nicht auf meine' Nummer' gesetzt hätte? – JKunstwald

+0

Du hast mein Leben gerettet! Vielen Dank :) – Sparw

Verwandte Themen