У меня есть сервер Node.js, который постоянно сбой, не записывая никаких сообщений об ошибке. Это типичный сценарий? Как я могу уловить ошибку и зарегистрировать ее до сбоя?
Node.js сбой сервера без сообщения об ошибке
Ответ 1
Хорошим началом было бы настроить, особенно в производстве, перед установкой слушателя для вашего сервера, обработчиком исключений, который регистрирует детали. Посмотрите здесь:
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 ?
});
Если вы используете Express.js, посмотрите здесь, чтобы узнать, как увидеть полный стек вашей ошибки (и, в конечном итоге, еще раз, отправьте его по электронной почте, если вы на производстве). В этом случае сообщите ему, чтобы предоставить вам полную информацию, прежде чем создавать экземпляр слушателя:
var express = require('express');
// ...
var app = express();
// ...
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
// then, set the listener and do your stuff...
Ответ 2
Чтобы закончить ответ @matteofigus, вы также можете прослушивать необработанные обещания.
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`
Ответ 3
Вы можете использовать промежуточное программное обеспечение, называемое "обработчик ошибок", и с помощью "logger" (log4js-npm-package) вы можете вести журнал для всех исключений. Здесь код для Errorhandler:
//Middleware: обработчик ошибок Catch-All. Чтобы мы регистрировали ошибки, но не отправляем клиенту внутренние данные об ошибках.
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;
}
Ответ 4
Node v6.11.0, Windows 10.
Пробовал другие предложения здесь безрезультатно - приложение просто останавливается, без ошибок даже при использовании
process.on('uncaughtException',...)
process.on('unhandledRejection',....)
Наконец, отслеживается выход/сбой до рекурсивного вызова функции. Следующий код демонстрирует проблему:
"use strict" ;
process.on('uncaughtException', function (exception) {
console.log(exception);
});
var count = 0 ;
function recursiveFunction(){
console.log(count++);
recursiveFunction();
}
recursiveFunction() ;
Это пока запустится, а затем просто остановится. Try/Catch не работает - пробовал, как указано выше, с помощью
function recursiveFunction(){
console.log(count++);
try{
recursiveFunction();
}
catch(e){
console.log("recursion error");
}
}
Опять ничего - просто останавливается.
Обходной путь (без необходимости перепроектировать код) заключается в использовании setImmediate (чтобы избежать процесса рекурсии);
function recursiveFunction(){
console.log(count++);
setImmediate(recursiveFunction);
}
(я в конце концов ctrl-c'd это, чтобы остановить его.)
сообщили Node проблемы github