2015-05-23 6 views
5

Ich versuche, die neue instabile Version von mongoose> 4.0.0 zu verwenden, um Aktualisierungsabfragen zu validieren.In Mungo Pre-Middleware, wie kann ich auf die Update-Abfrage zugreifen?

sagen, dass ich ein Schema mit der folgenden Abfrage

schema.update({_id:'blah'},{a:'blah'},function(err){ 
//do your thing 
}) 
aktualisieren mag

so kann sagen, dass ich das folgende Schema habe,

var schema = new Schema({ 
a:{type:String} 
}); 

schema.pre('update',function(next){ 
var findQuery=this._conditions; // gives {_id:'blah'} 

// how do i get {a:'blah'}???? 

next(); 
}); 

, wie ich die Update-Abfrage von {Set erhalten Sie: {a: 'blah'}} in der Pre-Middleware, damit ich vor dem Update einige Überprüfungen durchführen kann?

alternativ ich weiß, dass die Update-Abfrage in der Post-Middleware zugegriffen werden kann, in

schema.post('update',function(){ 
var findQuery=this._conditions; // gives {_id:'blah'} 

var updateQuery=this._update; //gives {$set:{a:'blah'}} 

next(); 
}); 

, aber das ist zu spät, ich brauche dies in der Pre-Middleware, bevor sie tatsächlich zu überprüfen, die DB zu aktualisieren.

Ich habe versucht, durch das 'This' Objekt der Pre-Middleware zu suchen, kann aber das updateQuery-Objekt nirgendwo finden und this._update ist in der Pre-Middleware undefiniert.

Gibt es eine Möglichkeit, dies zu tun? danke

Antwort

1

Falls Sie immer noch nach einer Lösung suchen, die auf Array-Operationen funktioniert, sieht es aus wie in neueren Versionen von Mungo (mindestens 4.0.7+), this._update ist in der Pre-Middleware definiert.

0

Ich fand eine Arbeit durch dieses besondere Beispiel, aber es löst nicht wirklich mein tatsächliches Problem. Was Sie in der Mungo-Version ~ 4.0.0 tun können, ist, die Pre-Middleware angeben zu lassen, dass sie die Modellvalidierung bei der Aktualisierung durchläuft.

schema.pre('update',function(next){ 
    this.options.runValidators = true; // make sure any changes adhere to schema 
}) 

im Grunde können Sie dann geben Sie die Validierer innerhalb des Schemas

var schema = new Schema({ 
    a:{ 
     type:String, 
     validate:[...] //the validation you want to run 
    } 
}); 

Sie können wählen, die Validierung auf einem normalen Speichervorgang überspringen, indem Sie die this.isNew Prüfung innerhalb Validierungsfunktionen.

Mit diesem Code wird validate ausgeführt: [...] auf einem beliebigen $ set und $ unset auf a in Ihrer Aktualisierungsabfrage.

jedoch funktioniert es nicht auf Array-Operationen wie $ push oder $ addToSet aus irgendeinem Grund. Wenn Sie also ein Array aktualisieren, wird der Validierungscode überhaupt nicht ausgeführt! Daher löst es nicht das eigentliche Problem. aber es kann mit dem Beispiel funktionieren, das für irgendjemanden zur Verfügung gestellt wird, der auf dieses spezielle Problem stößt

Verwandte Themen