2013-03-26 20 views
33

Mam ten kodDlaczego Mongoose nie sprawdza poprawności aktualizacji?

var ClientSchema = new Schema({ 
    name: {type: String, required: true, trim: true} 
}); 

var Client = mongoose.mode('Client', ClientSchema); 

Korzystanie Express, utworzyć nowego klienta z tym kodem

var client = new Client(req.body); 
client.save(function(err, data) { 
    .... 
}); 

Jeśli mogę zostawić puste pole w formularzu imię, mangusta nie pozwala stworzyć klient, ponieważ ustawiłem go jako wymagany w schemacie. Ponadto, jeśli zostawiam spacje przed i po nazwie, mangusta usunie te spacje przed zapisaniem.

Teraz staram się aktualizować klienta z tym kodem

var id = req.params.id; 
var client = req.body; 
Client.update({_id: id}, client, function(err) { 
    .... 
}); 

pozwól mi zmienić nazwę, ale jeśli pozostawić puste w formie, mangusta nie sprawdza i zapisać pustą nazwę . Jeśli dodaję puste spacje przed i po nazwie, zapamięta nazwę spacjami.

Dlaczego mangusta sprawdza się przy zapisie, ale nie w aktualizacji? Robię to w niewłaściwy sposób?

MongoDB: 2.4.0 mangusta: 3.6.0 express: 3.1.0 węzeł: 0.10.1

+0

z którym podejściem podążyłeś? Po prostu ciekawy, w obliczu tego samego problemu. Czy możesz podać przykład tutaj? Wielkie dzięki. – Imran

Odpowiedz

41

nie robisz nic złego, validation jest zaimplementowany jako wewnętrznego oprogramowania pośredniczącego middleware ciągu Mangusta i nie robi Zadanie zostanie wykonane podczas update, ponieważ jest to zasadniczo przekazywanie do rodzimego sterownika.

Jeśli chcesz, aby zmiana klient zatwierdzone musisz find obiekt zaktualizować, zastosować nowe wartości nieruchomości do niego (patrz extend sposób podkreślenia jest), a następnie zadzwonić save na nim.

Mongoose 4.0 Aktualizacja

Jak zauważył w komentarzach i odpowiedzi victorkohl, w Mongoose teraz wspierać walidację dziedzinach $set i $unset operatorów, gdy użytkownik włączy opcję w wywołaniu update .

+3

Istnieje kilka biletów GitHub o walidacji Mongoose na temat aktualizacji, zobacz [Problem 860] (https://github.com/LearnBoost/mongoose/issues/860), [Issue 892] (https://github.com/LearnBoost/ mongoose/issues/892), a także [Issue 4722] (https://github.com/LearnBoost/mongoose/issues/4722). Mam nadzieję, że to naprawią wkrótce ... –

+0

_.extend naprawdę pomógł mi tutaj, ponieważ potrzebowałem zaktualizować kilka różnych pól poddokumentów z częściowego obiektu json. Dziękuję Ci! –

+2

Od v3.9.3, update() trwa 2 dodatkowe opcje: setDefaultsOnInsert i runValidators @see https://github.com/LearnBoost/mongoose/commit/1d8c3e96c7b11497d3325e9cf1f7ae66c9ee560e – wittgenstein

48

Od Mongoose 4.0 ty can run validators na update() i findOneAndUpdate() przy użyciu nowej flagi .

Mongoose 4.0 introduces an option to run validators on update() and findOneAndUpdate() calls. Turning this option on will run validators for all fields that your update() call tries to $set or $unset .

Na przykład, biorąc pod uwagę OP Schemat:

var ClientSchema = new Schema({ 
    name: {type: String, required: true, trim: true} 
}); 

var Client = mongoose.model('Client', ClientSchema); 

Przekazanie flagi na każdej aktualizacji

Można użyć nową flagę tak:

var id = req.params.id; 
var client = req.body; 
Client.update({_id: id}, client, { runValidators: true }, function(err) { 
    .... 
}); 

Używanie flagi pod numerem pre hak

Jeśli nie chcesz, aby ustawić flagę za każdym razem aktualizować coś można ustawić pre hak findOneAndUpdate():

// Pre hook for `findOneAndUpdate` 
ClientSchema.pre('findOneAndUpdate', function(next) { 
    this.options.runValidators = true; 
    next(); 
}); 

Następnie można update() używając weryfikatorów bez minięciu runValidators flaga za każdym razem.

+4

to powinno być oznaczone jako poprawna odpowiedź – Jeremy

+1

Podobała mi się ta odpowiedź, ale prehook dla findOneAndUpdate zgłasza błąd mangusty ... wygląda na to, że może nie być obsługiwana ta metoda? Ponadto określenie prehook "update" nie powoduje zatwierdzenia. Błąd: /.../mongoose/node_modules/hooks/hooks.js: 149 if ('undefined' === typeof proto [methodName]. numAsyncPres) { – Doug

+0

Doug, oprogramowanie pośredniczące do dodawania haków do findONeAndUpdate zostało dodane w Mongoose 4.0 (https://github.com/Automattic/mongoose/issues/2138). Czy na pewno używasz Mongoose 4.0 lub nowszego? – aaronroberson

Powiązane problemy