我正在使用the express-domain-middleware模块将我的请求包装在域中。在我的错误中间件中,我有以下检查:
if(err.domain) {
//something should happen here, it's completely uncaught
}
else {
//silly kids, I'll log this and send a 500;
以上代码段基于express-domain-middleware
文档中的此示例:
//with domain-middleware
app.use(require('express-domain-middleware'));
app.use(app.router);
app.use(function errorHandler(err, req, res, next) {
console.log('error on request %d %s %s', process.domain.id, req.method, req.url);
console.log(err.stack);
res.send(500, "Something bad happened. :(");
if(err.domain) {
//you should think about gracefully stopping & respawning your server
//since an unhandled error might put your application into an unknown state
}
});
app.get('/error', function(req, res, next) {
db.query('SELECT happiness()', process.domain.intercept(function(rows) {
fs.readFile('asldkfjasdf', process.domain.intercept(function(contents) {
process.nextTick(process.domain.intercept(function() {
throw new Error("The individual request will be passed to the express error handler, and your application will keep running.");
}));
}));
}));
});
如果在域外发生此异常,我不想做的就是调用process.exit(1)
(我认为没有人会这样做,对吧?)。我也不想让我的应用程序处于危险状态。我宁愿只记录未捕获的异常,以便稍后重构它,优雅地重新启动这个域(服务器?),然后继续讨论。
Forever
采取什么行为。我有目的地使用Forever
在本地启动应用程序并观察它在强制执行未处理的异常时自动重启 - 但我在Mac上开发并且应用程序在Windows上运行。需要Windows解决方案=)修改编辑:如果有误解,请更正我,我不知道域内发生的事情和未捕获的异常。我在这里学习!!
答案 0 :(得分:0)
节点程序可以在spawn:
的帮助下重启自己var exec = require('child_process').exec;
spawn('sh', ['-c', 'sleep 2; node /home/username/Desktop/MainNodeApplication.js'], {
detached: true,
stdio: ['ignore', 'ignore', 'ignore']
});
process.exit(0);
以前的代码是为在Linux机器上运行而编写的,其中一个非常简单的节点脚本存储在/home/username/Desktop/MainNodeApplication.js中。此代码生成另一个进程,将其与父进程分离,然后立即退出。同时,生成的进程在2秒内重新启动节点脚本,在我们完好后确定其他实例有时间关闭。
这并不能让您一路走到您想要的地方,但它可以让您优雅地重启您的代码。您可以在启动时传递参数,以便让它更好地了解它应该出现的状态,或者将错误信息传递给用户。您可以通过在spawn参数中为节点调用添加参数来实现此目的。