2012-08-08 21 views
22

Jestem absolutnym początkującym programistą NodeJS i chcę stworzyć prosty REST-Webservice z Expressem i Mongoose.Obsługa błędów z Mongoose

Jaką najlepszą praktykę radzić sobie z błędami mangusty w jednym centralnym miejscu?

Kiedy gdziekolwiek błąd bazy danych występuje Chcę zwrócić http-500-error-stronę z komunikatem o błędzie:

if(error) { 
    res.writeHead(500, {'Content-Type': 'application/json'}); 
    res.write('{error: "' + error + '"}'); 
    res.end(); 
} 

w starym poradniku http://blog-next-stage.learnboost.com/mongoose/ Czytałem o to globalny słuchacza błędzie:

Mongoose.addListener('error',function(errObj,scope_of_error)); 

Ale to nie działa i nie mogę znaleźć czegoś w tym słuchaczu o numerze official Mongoose documentation. Czy po każdej prośbie Mongo sprawdzam błędy?

Odpowiedz

40

Jeśli używasz Express, błędy są zwykle obsługiwane bezpośrednio na trasie lub w interfejsie API zbudowanym na szczycie mangusty, przekazując błąd do next.

app.get('/tickets', function (req, res, next) { 
    PlaneTickets.find({}, function (err, tickets) { 
    if (err) return next(err); 
    // or if no tickets are found maybe 
    if (0 === tickets.length) return next(new NotFoundError)); 
    ... 
    }) 
}) 

The NotFoundError może być powąchał w error handler middleware dostarczenie dostosowanych wiadomości.

Niektóre abstrakcje są możliwe, ale nadal będziesz potrzebować dostępu do metody next, aby przekazać błąd w dół łańcucha trasy.

PlaneTickets.search(term, next, function (tickets) { 
    // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node 
}) 

chodzi o centralnie obsługi błędów Mongoose, tam naprawdę nie jedno miejsce obsługiwać je wszystkie. Błędy mogą być obsługiwane na kilku różnych poziomach:

connection błędy są emitowane na connection modeli używasz, więc

mongoose.connect(..); 
mongoose.connection.on('error', handler); 

// or if using separate connections 
var conn = mongoose.createConnection(..); 
conn.on('error', handler); 

Dla typowych zapytań/aktualizacji/usuwa błąd zostanie przekazany do wywołania zwrotnego.

PlaneTickets.find({..}, function (err, tickets) { 
    if (err) ... 

Jeśli nie zdać zwrotnego błąd jest emitowany na Modelu jeśli słuchasz za nim:

PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request! 
ticket.save(); // no callback passed 

Jeśli nie zdać zwrotnego i nie słuchasz błędy na poziomie model będą emitowane na modelach connection.

Kluczem do zabrania tutaj jest to, że chcesz uzyskać dostęp do next, aby jakoś przekazać błąd.

+0

Dzięki, Twoja pomocna odpowiedź wyjaśnia wiele kwestii związanych z obsługą błędów. – Sonson123

+0

Świetna odpowiedź! Szczególnie sugestia dotycząca użycia next() do bezpośredniego wiązania z oprogramowaniem pośredniczącym do obsługi błędów ExpressJS. –

+0

To nie działa z mongoose.connection.on ("błąd", handler); lub conn.on ("błąd", handler); dla mnie zdefiniowałem handler jako funkcję, która console.log() pierwsza arg, ale nic nie pojawia się na konsoli serwera. – Vadorequest