Как узнать, какое исключение произошло при сбое моего приложения?

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

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

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

TypeError: Converting circular structure to JSON

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Лучший способ справиться с исключением — создать одну вспомогательную функцию, в которой вы должны настроить инструмент регистрации ошибок, такой как (rollbar в 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());

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

try {

   suspectedFunction()
}
catch(e) {

   logError(e)

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

}

Вы можете попробовать библиотеку ведения журнала, такую ​​​​как 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.info(`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()
      )
  }));

Другие вопросы по теме