Wygląda na to, że raportowanie / obsługa błędów przebiega inaczej w aplikacjach Node.js + Express.js w porównaniu do innych frameworków. Czy mam rację, rozumiejąc, że działa to w następujący sposób?
A) Wykryj błędy, otrzymując je jako parametry funkcji zwrotnych. Na przykład:
doSomethingAndRunCallback(function(err) {
if(err) { … }
});
B) Zgłoś błędy w oprogramowaniu MIDDLEWARE, wywołując next (err). Przykład:
handleRequest(req, res, next) {
// An error occurs…
next(err);
}
C) Zgłoś błędy w TRASACH, wyrzucając błąd. Przykład:
app.get('/home', function(req, res) {
// An error occurs
throw err;
});
D) Uchwyt błędy przez konfigurowanie własnego obsługi błędów poprzez app.error () lub użyć rodzajowe obsługi błędów Connect. Przykład:
app.error(function(err, req, res, next) {
console.error(err);
res.send('Fail Whale, yo.');
});
Czy te cztery zasady stanowią podstawę całej obsługi / raportowania błędów w aplikacjach Node.js + Express.js?
Pracownicy firmy Joyent opublikowali w tej sprawie naprawdę wnikliwy dokument przedstawiający najlepsze praktyki . Artykuł obowiązkowy dla każdego programisty Node.js.
źródło
Dlaczego pierwszy parametr?
Ze względu na asynchroniczną naturę node.js The pierwszy parametr-as-err wzór stał się uznanym konwencji dla obsługi błędów userland node.js . Dzieje się tak, ponieważ asynchroniczne:
Więc zamiast tego posiadanie pierwszego argumentu wywołania zwrotnego jest właściwie jedynym rozsądnym sposobem na asynchroniczne przekazywanie błędów, inny niż tylko ich zgłaszanie.
Spowoduje to
unhandled exception
, że w wyniku tego, tak jak to brzmi, nie zrobiono nic, aby wyprowadzić aplikację ze stanu pomieszania.Wyjątki, dlaczego one istnieją
Warto jednak zauważyć, że praktycznie cała część Node.js to emitery zdarzeń, a zgłoszenie wyjątku jest zdarzeniem niskiego poziomu, które można obsłużyć jak wszystkie zdarzenia:
To może, ale nie powinno być doprowadzane do skrajności, aby wyłapać wszystkie błędy i stworzyć aplikację, która będzie bardzo się starała, aby nigdy się nie zawiesić. Jest to okropny pomysł w prawie każdym przypadku użycia, ponieważ pozostawi programistę bez pojęcia, co się dzieje w stanie aplikacji i jest analogiczne do pakowania main w try-catch.
Domeny - logiczne grupowanie zdarzeń
W ramach rozwiązywania problemu wyjątków powodujących przewracanie się aplikacji, domeny pozwalają deweloperowi wziąć na przykład aplikację Express.js i spróbować rozsądnie zamknąć połączenia w przypadku katastrofalnej awarii.
ES6
Prawdopodobnie wspomina, że to się zmieni ponownie, ponieważ ES6 umożliwia wzorcowi generatora tworzenie zdarzeń asynchronicznych, które są nadal możliwe do złapania za pomocą bloków try / catch.
Koa (napisany przez TJ Holowaychucka, tego samego oryginalnego autora Express.js) wyraźnie to robi. Używa instrukcji ES6
yield
do tworzenia bloków, które wyglądają prawie synchronicznie, ale są obsługiwane w zwykły sposób asynchroniczny węzła:Ten przykład został stąd bezwstydnie skradziony .
źródło