Я работаю над модулем NodeJS, и у меня есть следующая проблема:
Когда в цепочке обещаний возникает какая-то ошибка, я могу обработать исключение, зарегистрировать его в своем централизованном инструменте ведения журнала, и все в порядке.
Тем не менее, время от времени я вижу некоторые ошибки, которые приводят к сбою приложения, и оно перезапускается, и мне нечего делать. Только когда я просматриваю журналы на машине, я могу понять, что происходит. Последний был такой:
TypeError: Converting circular structure to JSON
Как я могу зарегистрировать ошибку, которая приводит к сбою приложения, в централизованный инструмент журнала. Я понимаю, что если приложение умерло, оно ничего не сможет сделать. Но для этого должна быть стратегия





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