2012-07-04 6 views
10
Speicher ändern

Ich mag für meine Benutzerdokumente ein Modell Schicht mit Mongoose zu schaffen, das tut:Mongoose ODM, Variablen vor

  1. Validierung (einzigartig, Länge)
  2. Kanonisierung (Benutzername und E-Mail umgewandelt werden Klein
  3. Einzigartigkeit)
  4. Salz Generation zu prüfen
  5. Passwort Hashing
  6. (Logging)

Alle diese Aktionen müssen ausgeführt werden, bevor sie in der db gespeichert werden. Glücklicherweise unterstützt Mungo Validierung, Plugins und Middleware.

Die schlechte Sache ist, dass ich kein gutes Material zu diesem Thema finden kann. Die offiziellen Dokumente auf mongoosejs.com sind zu kurz ...

Hat jemand ein Beispiel über Voraktionen mit Mongoose (oder ein komplettes Plugin, das alles tut, wenn es existiert)?

Grüße

+0

dachte ich, die Dokumentation auf mongoosejs.com war ziemlich klar, in diesem Bereich. Was hast du probiert, das funktioniert nicht? – JohnnyHK

+0

der Validierungssektor ist klar, aber nicht, wie man das Objekt vor etwas Persistenz vorbereitet. Ich denke das Schema.pre ('speichern', Rückruf); Funktion könnte es aber das ganze Beispiel fehlt auch ich weiß nicht, wie Sie auf die Attribute des Objekts in der Pre-Funktion zugreifen –

+0

Sie greifen auf die Attribute des Dokuments über 'das' in Ihrer Middleware-Funktion. – JohnnyHK

Antwort

24

In Ihrer Schema.pre('save', callback) Funktion ist this das Dokument gespeichert wird, und es vorgenommenen Änderungen vor next() ändern aufrufen, was zu retten ist.

14

Eine andere Möglichkeit ist Getters zu verwenden. Hier ist ein Beispiel von der Website:

function toLower (v) { 
    return v.toLowerCase(); 
} 

var UserSchema = new Schema({ 
    email: { type: String, set: toLower } 
}); 

http://mongoosejs.com/docs/getters-setters.html

+0

Es ist erwähnenswert, dass dies die einzige Option ist, wenn der Wert, den Sie übergeben, nicht der gleiche Typ ist, der im Schema für die angegebene Eigenschaft definiert ist . Z.B. Sie haben eine Eigenschaft 'amount' vom Typ' number', aber der Wert, den Sie zur Verarbeitung übergeben, ist eine 'Zeichenkette'. – Don

8
var db = require('mongoose'); 
var schema = new db.Schema({ 
    foo:  { type: String } 
}); 

schema.pre('save', function(next) { 
    this.foo = 'bar'; 

    next(); 
}); 

db.model('Thing', schema); 
+0

konnte festgestellt werden, dass pre für 'save' nicht auf update reagiert. Verwenden Sie stattdessen 'update' – sasha