当我们写了个NodeJS程序的时候,一般用node yourjsfile.js命令启动该程序。但是如果程序中有东西出错,这个进程就会退出。我们写程序不可能保证万无一失,肯定有些没有处理的错误,这就让很多人觉得NodeJS不稳定,容易产生很多故障。 下面我就讲讲几种方法增加你的NodeJS程序的稳定性。
1.使用 try{…} catch(error){…} 来执行容易出错的代码段。比如解析一个外来的json字符串等。
2.使用 process.on('uncaughtException’, function(err){…}); 来处理未被捕捉的错误。
3.试用奶妈进程来启动你的程序,检测子进程的退出,然后自动重启该进程。比如 mother.js :
start();
function start()
{
console.log(‘Mother process is running.’);
var ls = require(‘child_process’).spawn('node’, [‘server.js’]);
ls.stdout.on('data’, function (data)
{
console.log(data.toString());
});
ls.stderr.on('data’, function (data)
{
console.log(data.toString());
});
ls.on('exit’, function (code)
{
console.log('child process exited with code ' + code);
delete(ls);
setTimeout(start,5000);
});
}
欢迎大家补充。
最近正被nodejs稳定性困扰,前两个办法似乎都不能解决我的问题。
由于nodejs中很多处理都是异步的,try…catch对于callback中的error无能为力。
第2个办法我已经用了,但程序依然会毫无征兆地退出,uncaughtException的callback没有执行。
启动参数加了–trace_exception也不管用,不知道还有没有其它方法?
uncaughtException是个不得已的方法,不建议太依赖它,该容错的地方还得老老实实try … catch。
callback里异常的捕获确实麻烦,因为try … catch 只能抓到同一个ticket中的异常,而callback属于不同的ticket。这种情况只能在callback函数内部try…catch
谢谢回答。
uncaughtException主要是用来debug,以便有机会找到异常原因并修复。
其实我想问nodejs(或v8)有哪些debug/profiling方法,我的一个程序每运行N天左右异常退出,且没有stack trace,普通的单步调试方法基本上找不到错误原因。想解决这样的问题。
后来发现有一个v8启动参数: node --stack_trace_on_abort
但得到的错误信息非常少,需要进行更多的profiling才能找到错误根源。
可以试下这个forever 模块,https://github.com/nodejitsu/forever ,这里有篇介绍文档http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever。