我正在使用NodeJS模块,并且遇到以下问题:
当Promise链中发生错误时,我可以处理该异常,将其记录到集中式日志记录工具中,一切都很好。
但是,我不时看到一些错误,这些错误立即导致应用程序崩溃,并且它重新启动,使我无所事事。只有查看机器中的日志,我才能弄清楚发生了什么。最新的是这样的:
TypeError: Converting circular structure to JSON
如何将导致应用程序崩溃的错误记录到集中式日志工具中。我了解,如果该应用程序死了,它将无能为力。但是必须有一种策略来做到这一点
答案 0 :(得分:1)
处理异常的最佳方法是创建一个辅助函数,在该函数中必须使用错误记录工具(如heroku中的滚动条)进行配置,并且在每个函数/路由中,都必须在try-catch块中包含源代码。 在try部分中编写代码,并使用helper函数,并将异常传递给helper文件。看起来像这样
//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());
答案 1 :(得分:0)
在try / catch块中放置任何可能产生错误的表达式。在该错误中进行处理或将其附加新信息进行转发。
try {
suspectedFunction()
}
catch(e) {
logError(e)
if (necessary){
e.parseSuccess = false;
throw e
}
}
答案 2 :(得分:0)
您可以尝试使用带有Express-winston模块express-winston的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()
)
}));