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.
Dzięki, Twoja pomocna odpowiedź wyjaśnia wiele kwestii związanych z obsługą błędów. – Sonson123
Ś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. –
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