有文章说,不要在process里进行uncaughtException监听,因为会引起进程挂起,但要怎么处理还有待研究。我想出一个办法,就是加一个midleware把response保存起来,然后在uncaughtException里向用户返回。单机可行,虽然还可能存在些问题,但胜于无,在此抛出来让大家看看,如果有更好办法最好了。
app.use(function (req, res, next) {
process.responseObject = res;
next();
});
process.on('uncaughtException', function (err) {
console.error(' Caught exception: ' + err.stack);
var res = process.responseObject;
if(!res) return;
if (app.get('env') === 'development') {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
}else{
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
}
});
这个办法好处是进程不会持掉,坏处是response对象是全局的,如果多个用户同时出现问题将引起混乱。
另外还有一个处理方法是让它挂掉,在这里处理一些挂掉前的数据保存,当然了,还得结合pm2来让它重启。
请不要使用此模式,使用cluster或者pm2 cluster model,进行多线程处理,挂掉的重新启动