我有一个 Node.js 服务器,它不断崩溃而没有记录任何类型的错误消息。这是典型的场景吗?如何在崩溃之前捕获错误并记录它?
5 回答
一个好的开始是设置,尤其是在生产环境中,在为您的服务器设置侦听器之前设置一个记录详细信息的异常处理程序。看这里:
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();
var errorHandler = require('errorhandler')
// ...
app.use(errorHandler({ dumpExceptions: true, showStack: true }));
// then, set the listener and do your stuff...
2019 更新:您需要安装errorHandler 包
要完成@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`
如果有人遇到与我类似的问题:我有一个崩溃的 Node.js 服务器,完全没有错误,并且在意识到这是因为在我的代码中某处我正在写入一个文件之前,我拉了一个小时的头发writeFileSync("./foo.json", "…")
,这当然可以,但这会导致服务器“崩溃”,因为我使用 PM2 来“监视”服务器目录中的文件更改 - 即,每当服务器目录中的文件发生更改时,PM2 都会重新启动服务器。我通过为文件夹添加watch_ignore
配置并放入其中解决了这个问题。.data
foo.json
节点 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 来阻止它。)
您可以使用名为“errorhandler”的中间件和“logger”(log4js-npm-package),您可以保留所有错误异常的日志。这是 Errorhandler 的代码:
// 中间件:包罗万象的错误处理程序。这样我们就可以记录错误,但不会将内部错误详细信息泄露给客户端。
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;
}