Подтвердить что ты не робот

Node.js сбой сервера без сообщения об ошибке

У меня есть сервер Node.js, который постоянно сбой, не записывая никаких сообщений об ошибке. Это типичный сценарий? Как я могу уловить ошибку и зарегистрировать ее до сбоя?

4b9b3361

Ответ 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