2012-07-11 6 views

Respuesta

18

Mongoose le permite configurar ajustadores personalizados en los que realiza la comparación. pre ('guardar') por sí mismo no le dará lo que necesita, pero juntos:

schema.path('name').set(function (newVal) { 
    var originalVal = this.name; 
    if (someThing) { 
    this._customState = true; 
    } 
}); 
schema.pre('save', function (next) { 
    if (this._customState) { 
    ... 
    } 
    next(); 
}) 
+0

Justo lo que necesitaba. Gracias. – smabbott

+1

¿Debo hacer esto para acceder al valor anterior en ** validadores **? ¿O hay una manera más directa en el caso de los validadores? – eagor

+0

@aaronheckmann perdón por resucitar un hilo viejo, supongo que esto no funcionará, si tenemos un servidor de nodos múltiples detrás de un equilibrador de carga. – Saurabh

12

La respuesta aceptada funciona muy bien. Una sintaxis alternativa también se puede utilizar, con la línea de la moda con la definición de esquema:

var Person = new mongoose.Schema({ 
    name: { 
    type: String, 
    set: function(name) { 
     this._previousName = this.name; 
     return name; 
    } 
}); 

Person.pre('save', function (next) { 
    var previousName = this._previousName; 
    if(someCondition) { 
    ... 
    } 
    next(); 
}); 
+0

¿Qué pasa si se produce un error al guardar? – R01010010

1

Honestamente, he intentado las soluciones publicados aquí, pero tuve que crear una función que almacenaría los viejos valores en una matriz, guarde los valores, y luego vea la diferencia.

// Stores all of the old values of the instance into oldValues 
const oldValues = {}; 
for (let key of Object.keys(input)) { 
    if (self[key] != undefined) { 
     oldValues[key] = self[key].toString(); 
    } 

    // Saves the input values to the instance 
    self[key] = input[key]; 
} 

yield self.save(); 


for (let key of Object.keys(newValues)) { 
    if (oldValues[key] != newValues[key]) { 
     // Do what you need to do 
    } 
} 
Cuestiones relacionadas