Mam serwer Node.js, który ciągle się zawiesza, nie rejestrując żadnego komunikatu o błędzie. Czy to typowy scenariusz? Jak mogę przechwycić błąd i zalogować go, zanim się zawiesi?Awaria serwera Node.js bez komunikatu o błędzie
Odpowiedz
Dobrym początkiem byłoby ustawienie, szczególnie w produkcji, przed ustawieniem detektora dla serwera, procedura obsługi wyjątków rejestrujących szczegóły. Spójrz na here:
process.on('uncaughtException', function (exception) {
console.log(exception); // to see your exception details in the console
// if you are on production, maybe you can send the exception details to your
// email as well ?
});
Jeśli używasz Express.js, spojrzeć na here umieć zobaczyć pełny stos swój błąd (i ostatecznie znów wysłać go do wiadomości e-mail, jeśli są na produkcja). W takim przypadku, należy poinformować go, aby dać Ci wszystkie szczegóły przed instancji słuchacza:
var express = require('express');
// ...
var app = express();
// ...
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
// then, set the listener and do your stuff...
Oprogramowanie pośredniczące "errorHandler' nie jest już dostarczane z plikiem ekspresowym. Możesz zainstalować go przez puszczenie 'npm install errorhandler' - zobacz szczegóły tutaj https://github.com/expressjs/errorhandler – muchweb
Aby zakończyć odpowiedź @matteofigus, można również listen for unhandled promise rejections.
process.on('unhandledRejection', (reason, p) => {
console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
// application specific logging, throwing an error, or other logic here
});
somePromise.then((res) => {
return reportToUser(JSON.pasre(res)); // note the typo (`pasre`)
}); // no `.catch` or `.then`
Można używać middleware o nazwie 'ErrorHandler' & z 'rejestratora' (log4js-NPM-pakietu) można przechowywać dziennik dla wszystkich wyjątków błędach. Oto kod dla Errorhandler:
// Middleware: Catch-All Error Handler. Abyśmy rejestrowali błędy, ale nie ujawniamy szczegółów błędów wewnętrznych klientowi.
app.use(errorHandler);
function errorHandler(err, req, res, next) {
// XHR Request?
if (req.xhr) {
logger.error(err);
res.status(500).send({ error: 'Internal Error Occured.' });
return;
}
// Not a XHR Request.
logger.error(err);
res.status(500);
res.render('framework/error', { error: "Internal Server Error." });
// Note: No need to call next() as the buck stops here.
return;
}
v6.11.0 Node, Windows 10.
Próbowałem inne sugestie tutaj bezskutecznie - aplikacja po prostu przestaje, brak błędów nawet przy użyciu
process.on('uncaughtException',...)
process.on('unhandledRejection',....)
Wreszcie gąsienicowego wyjścia/katastrofie w dół rekurencyjne wywołanie funkcji. Poniższy kod demonstruje problem;
"use strict" ;
process.on('uncaughtException', function (exception) {
console.log(exception);
});
var count = 0 ;
function recursiveFunction(){
console.log(count++);
recursiveFunction();
}
recursiveFunction() ;
To będzie działać tak daleko, a następnie po prostu przestać. Try/Catch też nie działa - wypróbowany jak wyżej;
function recursiveFunction(){
console.log(count++);
try{
recursiveFunction();
}
catch(e){
console.log("recursion error");
}
}
Znów nic - po prostu się zatrzymuje.
Obejście problemu (bez konieczności przeprojektowania kodu) polega na użyciu metody setImmediate (w celu uniknięcia procesu rekursji);
function recursiveFunction(){
console.log(count++);
setImmediate(recursiveFunction);
}
(I ostatecznie Ctrl-c'd to, żeby go zatrzymać.)
zgłaszane na node github issues
- 1. Uruchamianie/zawieszanie Firebase bez komunikatu o błędzie
- 2. Sprawdź, czy obraz istnieje bez komunikatu o błędzie
- 3. Usuń pliki w partii z bez komunikatu o błędzie
- 4. Python: Uzyskiwanie komunikatu o błędzie wyjątku
- 5. Jak rozbroić sesję komunikatu o błędzie Magento?
- 6. Ustawianie niestandardowego komunikatu o błędzie z CarrierWave
- 7. Zmień tło komunikatu o błędzie EditText
- 8. Zmiana domyślnego komunikatu o błędzie z simple_form
- 9. Zgubienie komunikatu o błędzie Sentinel dla Redis
- 10. Dodawanie komunikatu o błędzie do niestandardowego weryfikatora
- 11. Komunikat o błędzie CUDA: nieokreślona awaria uruchamiania
- 12. Czy błąd zdarzenia xmlhttprequest nie powinien zawierać komunikatu o błędzie?
- 13. Azure (błąd HTTP wewnętrznego serwera HTTP 500). Potrzebuję lepszego komunikatu o błędzie
- 14. Wyświetlanie komunikatu o błędzie na formularzu przesłanym w angular2?
- 15. Nie można zrozumieć komunikatu o błędzie WCF, potrzebna pomoc
- 16. Który atrybut motywu zmienia kolor tekstu komunikatu EditText o błędzie
- 17. AVD nie uruchamia się (brak komunikatu o błędzie)
- 18. Wysyłanie sformatowanego komunikatu o błędzie do klienta z bloku catch
- 19. Gradle budować błąd po BSOD (java.lang.NullPointerException (brak komunikatu o błędzie)
- 20. PHP exec() nie zwraca komunikatu o błędzie na wyjściu
- 21. Jquery Sprawdź poprawność niestandardowej lokalizacji komunikatu o błędzie
- 22. Codeigniter - Wyświetlanie pojedynczego komunikatu o błędzie dla pól tablicy
- 23. Niestandardowa czcionka dla komunikatu o błędzie z TextInputLayout w Androidzie
- 24. Awaria aplikacji .NET bez informacji o debugowaniu
- 25. Błąd zestawu TextInputLayout bez komunikatu?
- 26. Próba parsowania JSON bez awarii serwera Node.js
- 27. Jak uzyskać aktualny numer wiersza procedury składowanej z komunikatu o błędzie?
- 28. Najlepsza praktyka sprawdzania schematu Mongoose i wyświetlania niestandardowego komunikatu o błędzie
- 29. Jak wysłać odpowiedź o błędzie serwera za pomocą php?
- 30. Łapanie błędów PHP mail() i wyświetlanie uzasadnionego komunikatu o błędzie użytkownika
Oprócz zalogowaniu niezłapane wyjątki, aby znaleźć przyczynę awarii, można sprawdzić, jeśli procesowi kończy się pamięć. –
Czy możesz polecić sposób sprawdzenia użycia pamięci serwera? –
Sposób, w jaki zrobiłem to dwa lata temu, polegał na uruchomieniu serwera węzła z powłoki i przechwytywaniu stderr. V8 w tym czasie bezceremonialnie wyjdzie i napisze komunikat o błędzie na stderr. Jednak V8 bardzo się zmieniło i nie wiem, czy ta technika zadziała. Monitorowanie pamięci procesowej może pomóc w przypadku awarii po długim czasie. –