Как узнать, какое исключение произошло при сбое моего приложения? - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над модулем NodeJS, и у меня возникает следующая проблема:

Когда в цепочке обещаний возникает какая-то ошибка, я могу обработать исключение, записать его в свой централизованный инструмент ведения журналов, и всену.

Однако время от времени я вижу некоторые ошибки, которые сразу же приводят к аварийному завершению работы приложения, и оно перезапускается, оставляя мне больше нечего делать.Только когда я просматриваю логи в машине, я могу понять, что происходит.Последним было следующее:

TypeError: Converting circular structure to JSON

Как зарегистрировать ошибку, которая приводит к сбою приложения, в централизованный инструмент регистрации.Я понимаю, что если приложение умерло, оно ничего не может сделать.Но должна быть стратегия, чтобы сделать это

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Поместите внутрь блока try / catch любое выражение, которое может вызвать ошибку.Обработайте ошибку или перешлите ее, добавив новую информацию.

try {

   suspectedFunction()
}
catch(e) {

   logError(e)

   if (necessary){
     e.parseSuccess = false;
     throw e
   }

}
0 голосов
/ 04 марта 2019

Вы можете попробовать библиотеку журналов, такую ​​как Winston, с модулем express-winston express-winston это обеспечивает промежуточное ПО для регистрации ошибок, например:

  var express = require('express');
  var expressWinston = require('express-winston');
  var winston = require('winston');
  var app = express();

  app.use(expressWinston.logger({
      transports: [
        new winston.transports.File({ filename: 'express.log' })
      ],
      format: winston.format.combine(
        winston.format.json()
      )
  }));

  app.get('/test', function(req, res, next) {
      res.send('All good');
  });

  app.get('/error', function(req, res, next) {
      // Let's cause an error.
      let r = JSON.stringify(req);
  });

  app.listen(3000, function(){
      console.log(`Express Listening on port ${this.address().port}`);
  });

  app.use(expressWinston.errorLogger({
      transports: [
          new winston.transports.File({ filename: 'express-error.log' })
      ],
      format: winston.format.combine(
          winston.format.json()
      )
  }));
0 голосов
/ 04 марта 2019

Лучший способ обработать исключение - создать одну вспомогательную функцию, которую вы должны сконфигурировать с помощью средства регистрации ошибок, такого как (rollbar in heroku), и в каждую функцию / маршруты вы должны включить свой исходный код в блок try-catch.Напишите свой код в разделе try и используйте вспомогательную функцию и передайте исключение в вспомогательный файл.Это будет выглядеть так

//helper.js

const handleException = (exception) => {
//configure your error logging tool here.
}
const internalServerError = env => (err, req, res, next) => {
  if (!err) {
    return next();
  }
  handleException(err)//utilize common handler
};

module.exports = { handleException }

и в основном файле

//app.js
const { handleException, internalServerError } = required('helper');
app.post((req, res) => {
   try {
      //your code will goes here
   } catch(err) {
     handleException(err)//you can customize error as per requirements
   }
});

//uncatch exception will trigger here. Put this bottom of the routes file. 
 app.use(internalServerError());
...