我尝试使用Express运行一个非常简单的Node JS服务器实现来提供EJS内容。当我启动服务器并且它运行得很好,但一段时间后意外崩溃。有时它会在半小时内崩溃,而有时它会一直保持4-6小时。
我似乎无法确定错误来源,因为我的日志不包含任何堆栈跟踪。
我已经采取了this answer's advice而且我有这个:
process.on('uncaughtException', function (exception) {
console.log(exception); // to see your exception details in the console
});
并且我还重载了console
方法以记录到文件,如下所示:
console.log = function(d) {
log(d);
};
console.error = function(d) {
log(d);
};
function log(message) {
log_file.write(util.format(message) + '\n');
log_stdout.write(util.format(message) + '\n');
}
但是,服务器崩溃而没有报告任何内容。我还试图创建一个节点domain
:
var domain = require('domain');
var d = domain.create();
d.on('error', function(err) {
console.error(err);
});
如果我不得不猜测,我会想象这个错误可能是由于内存耗尽而导致的,因为我在Raspberry Pi B型2上运行了所有这些,但我不能确定。如果它真的耗尽了内存,我希望看到:
致命错误:JS分配失败 - 处理内存不足
在我的日志中的某处报告。
我的服务器本身很简单:
// Create Express and set up the EJS view engine
var app = express();
app.set('view engine', 'ejs');
app.use("/resources", express.static(__dirname + "/resources"));
// Setup the index page view
app.get('/', function(req, res) {
console.log(getFormattedDate() + req.method + " " + req.url + " by " + req.connection.remoteAddress);
res.render('pages/index', {
title: "James Taylor",
content: formattedContent
});
});
app.get('*', function(req, res, next) {
var err = new Error();
err.status = 404;
next(err);
});
app.use(function(err, req, res, next) {
if (err.status == 404) {
console.error(getFormattedDate() + err + req.url);
res.set("Content-Type", "text/plain");
res.status(err.status);
res.send(err.message);
} else {
console.error(err);
return next();
}
});
与此同时,我已经能够使用forever来解决这个问题,这似乎很有效。
我很感激您就尝试解决此问题提出的任何建议。我不得不将所有这些基础设施围绕着永久性崩溃的服务器,这似乎是对的。