2016-01-19 19 views
6

dla łatwiejszego sprawdzenia poprawności wprowadzonych danych, Próbowałem upewnić się, że dokument mangusty można utworzyć tylko wtedy, gdy określone pole jest ustawione na true (To pole jest Oczywiście zawsze to prawda, JEŚLI dokument został właściwie utworzony, to z powodów sprawozdawczych).Sprawdzanie poprawności boolowskiej Mongoose nie jest użyteczne, jeśli dostarczony jest łańcuch znaków

Jest to uproszczona poc:

var mongoose = require('mongoose') 
mongoose.connect('mongodb://localhost:27017/playground') 

var Schema = mongoose.Schema 

var TestSchema = new Schema({ 
    testField: { 
    type: Boolean, 
    required: true 
    } 
}) 

// Try to ensure, that testField can only be true 
TestSchema 
    .path('testField') 
    .validate(function (testField) { 
    return (testField === true || testField === 'true') 
    }, 'Test-field must be true!'); 

var Test = mongoose.model('test', TestSchema); 


var newDoc = Test({ 
    testField: 'some random string' 
}) 

newDoc.save(function (err, newDoc) { 
    (err) ? console.log(err): console.log('newDoc was created') 
}) 

Problem polega na tym, że chociaż jestem dostarczanie losowy ciąg znaków zamiast wartości logicznej lub „logiczny ciąg” (na przykład „false” lub „true” zamiast tylko false/true), dokument jest nadal zapisywany poprawnie, z flagą ustawioną na true.

Jeśli dostarczę "fałsz" lub fałsz, sprawdzanie poprawności działa poprawnie i zgłasza błąd.

Wygląda na to, że przed zatwierdzeniem (i podobno domyślnym działaniem) wywoływana jest funkcja rzutowania. Czy istnieje sposób dla mnie, aby poprawić moją walidację, czy też muszę wyraźnie sprawdzić obiekt przed utworzeniem obiektu Mongoose?

To jest mangusta 4.3.6.

+0

Znaleźliście jeszcze rozwiązanie? Ten sam typ przymusu ma miejsce przed sprawdzeniem poprawności we wszystkich typach właściwości ... – Codepunkt

+1

Nie, jeszcze nie. Tylko obejście, w którym analizuję/sprawdzam ciąg przed przekazaniem go do sprawdzania poprawności schematu ... – BenSower

+0

Mam również dwie warstwy sprawdzania poprawności. Jeden do dezynfekcji bazy danych na warstwie bazy danych za pomocą mangusty i jeden do sprawdzenia danych wejściowych na warstwie punktu końcowego. Próba ponownego użycia logiki sprawdzania poprawności. Nie podoba mi się to. Nadal nie wiadomo, czy naprawdę powinniśmy potrzebować dwóch warstw sprawdzania poprawności. – Codepunkt

Odpowiedz

0

można zmienić typ Boolean String i zatwierdź jak ten

 testField: { 
      type : String, 
      required: true, 
      validate: { 
       validator: function (value) { 
        return value === "true" 
       }, 
       message: 'Field must be true' 
      } 
     }