2015-07-14 8 views
6

Próbuję złapać błędy wyrzucane z Mongoose, używając natywnych obietnic Mongoose. Ale nie wiem, skąd wziąć obiekt błędu z Mongoose.Mongoose save() przy użyciu rodzimej obietnicy - jak złapać błędy

Chciałbym, aby błędy zostały zgłoszone w .then() s i złapany w .catch(), jeśli to możliwe.

var contact = new aircraftContactModel(postVars.contact); 
contact.save().then(function(){ 
    var aircraft = new aircraftModel(postVars.aircraft); 
    return aircraft.save(); 
}) 
.then(function(){ 
    console.log('aircraft saved') 
}).catch(function(){ 
    // want to handle errors here 
}); 

Próba nieużywania innej biblioteki, ponieważ .save() zwraca obietnicę natywnie.

Odpowiedz

3

można rozszerzyć funkcjonalność obietnica na mangusta z bluebird

Promise = require('bluebird'); 
mongoose.Promise = Promise; 
+0

Tak, to jest nowa poprawna odpowiedź. Wiele lat temu jedna z pozostałych odpowiedzi była poprawna, więc zmieniłem poprawną odpowiedź na twoją odpowiedź. – steampowered

+0

Ta odpowiedź była już uwzględniona w notatce aktualizacji w (wcześniej) zaakceptowanej odpowiedzi (oprócz użycia Bluebird zamiast rodzimej obietnicy). –

19

MongooseJS używa mpromise library, który nie ma metody catch(). Aby złapać błędy, możesz użyć drugiego parametru dla then().

var contact = new aircraftContactModel(postVars.contact); 
contact.save().then(function() { 
    var aircraft = new aircraftModel(postVars.aircraft); 
    return aircraft.save(); 
    }) 
    .then(function() { 
    console.log('aircraft saved') 
    }, function(err) { 
    // want to handle errors here 
    }); 

UPDATE 1: Począwszy od wersji 4.1.0, MongooseJS pozwala teraz specification of which promise implementation to use:

Yup require('mongoose').Promise = global.Promise wykorzysta mangusta rodzimych obietnic. Powinieneś być w stanie wykorzystać żadnego konstruktora ES6 obietnica chociaż, ale teraz mamy tylko test z natywnym, Bluebird, a Q

Aktualizacja 2: Jeśli używasz mpromise w ostatnich wersjach 4.x dostaniesz ten deprication ostrzeżenie:

DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated 
+0

należy utworzyć funkcję obsługi błędów we wszystkich '.then()' s lub po prostu ostatni '.Następnie()'? Czy bańka błędów do tego czasu jest ostatnia, czy też muszę to robić? – steampowered

+0

To naprawdę zależy od Ciebie, ponieważ pojawiają się błędy. Możesz mieć catchall tak jak teraz lub możesz dodać kolejną obsługę błędu przy drugim zapisie z czymś takim jak: '.... save(). Then then (null, function (err) {...});' Po prostu trzeba postępować zgodnie z typową metodą propagacji błędu po jego obsłudze, jeśli zajdzie taka potrzeba. –

+0

@steampowered Twoja edycja jest nieprawidłowa. Od wersji Mongoose 4.11.4 (aktualna wersja od tego komentarza) nadal korzysta z mpromise dla kompatybilności wstecznej. Notatka aktualizacyjna z sierpnia 16 zawiera odpowiedź, którą wybrałeś. –

1

Prawdopodobnie zwrócisz obietnicę utworzoną przez metodę save, aby obsłużyć ją w innym miejscu. W takim przypadku możesz rzucić błąd na obietnicę rodzica, w której możesz złapać błąd. Można to osiągnąć w ten sposób:

function saveSchema(doc) { 
    return doc.save().then(null, function (err) { 
    throw new Error(err); //Here you are throwing the error to the parent promise 
    }); 
} 
function AParentPromise() { 
    return new Promise(function (accept, reject) { 
    var doc = new MongoSchema({name: 'Jhon'}); 
    saveSchema(doc).then(function() { // this promise might throw if there is an error 
     // by being here the doc is already saved 
    }); 
    }).catch(function(err) { 
    console.log(err); // now you can catch an error from saveSchema method 
    }); 
} 

Nie jestem pewien, czy to może być anty-wzorzec ale to pomóc obsługiwać błędy w jednym miejscu.

+0

Nie jestem zaznajomiony z składnią '=>' w javascript. Jak to jest nazywane? – steampowered

+0

@steampowered to tylko nowy sposób definiowania funkcji. Zmieniłem kod w celu lepszego zrozumienia. –

+1

@steampowered: Nazywa się to funkcją strzałki.Pochodzą one z ES6, podobnie jak rodzime obietnice :-) – Bergi