2017-06-02 4 views
1

Ich habe dies versucht, die null, undefined ermöglicht und vollständiger Wegfall des Schlüssels gespeichert werden:In mongoose wie benötige ich ein String-Feld, um nicht null oder undefiniert (erlaubt 0-Länge Zeichenfolge)?

{ 
    myField: { 
    type: String, 
    validate: value => typeof value === 'string', 
    }, 
} 

und das, was nicht '' (die leere Zeichenkette) gespeichert werden erlaubt:

{ 
    myField: { 
    type: String, 
    required: true, 
    }, 
} 

Wie erzwingen ich, dass ein Feld ein String und Gegenwart und weder null noch undefined in Mongoose, ohne die leere Zeichenkette zu Verbieten?

Damit new User({}) und new User({myField: null})
const mongoose = require('mongoose'); 

var userSchema = new mongoose.Schema({ 
    myField: { 
     type: String, 
     required: isMyFieldRequired, 
    } 
}); 

function isMyFieldRequired() { 
    return typeof this.myField === 'string'? false : true 
} 

var User = mongoose.model('user', userSchema); 

wird:

Antwort

1

Indem das gewünschte Feld bedingte gehen wird, kann dies erreicht werden Wurffehler. Aber die leere Zeichenfolge funktioniert:

var user = new User({ 
    myField: '' 
}); 

user.save(function(err, u){ 
    if(err){ 
     console.log(err) 
    } 
    else{ 
     console.log(u) //doc saved! { __v: 0, myField: '', _id: 5931c8fa57ff1f177b9dc23f } 
    } 
}) 
+0

Wie funktioniert das mit Filialdokumenten, bei denen ich nicht weiß, wo mein Schema bereitgestellt wird? Bei "erforderlichen" Callbacks ist "dies" immer das übergeordnete Element und ich kann nicht herausfinden, wie ich das Filialdokument innerhalb des Callbacks finden kann, ohne es an der falschen Stelle fest zu codieren. – binki

+0

Definieren Sie Filialdokumente nicht im Schema? Es sollte auch für ein verschachteltes Feld ähnlich funktionieren. Z.B. 'return typeof this.anotherField.nestedField === 'string'? false: true' –

+0

Wenn ich es generisch schreibe, wo ich ein Schema wie folgt definiere: 'const SubDocSchema = new mongoose.Schema ({a: {type: String, erforderlich: function() {return typeof this.a == = 'string'}}}) ', dann, wenn ich es als Filialdokument setze, wie' const SuperDocSchema = new mongoose.Schema ({subDoc: {type: SubDocSchema, default: SubDocSchema}}) ', dann wenn ich es versuche validiere eine Instanz eines Modells, das aus dem 'SuperDocSchema' erstellt wurde, überprüft es das Superdokument anstelle des Unterdokuments für die Eigenschaft' a', die nicht existiert, was mongoose sagt, dass die 'a'-Eigenschaft des Unterdokuments erforderlich ist. – binki

-1

Die Validierung wie

name: { 
    type: String, 
    validate: { 
     validator: function (v) { 
      return /^[a-zA-Z]+$/.test(v); 
     }, 
     message: '{PATH} must have letters only!' 
    }, 
}, 

die Sie interessieren in Modell

+0

Wenn ich, dass ich den Fehler '‚{PATH} ist required'' auch wenn Versorgung '‘ ' '(die leere Zeichenkette) für diese Eigenschaft. Ich habe das bereits in meiner Frage angesprochen (siehe das zweite Beispiel in meiner Frage). – binki

+0

Ja, Sie erhalten einen Fehler, da wir Text eingeben müssen, da wir die erforderliche echte Validierung angegeben haben. Diese Validierung dient zum void ist eine leere Zeichenfolge oder Leerstellen. –

+0

Ich möchte "null" und "undefined" auf meinem Feld nicht zulassen, aber erlaube jeden 'String'-Wert einschließlich der leeren, 0-Länge-Zeichenfolge (' '' '). Ist meine Frage nicht klar genug? – binki

Verwandte Themen