如何提高NodeJS程序的稳定性
发布于 13 年前 作者 longbill 17252 次浏览 最后一次编辑是 8 年前

当我们写了个NodeJS程序的时候,一般用node yourjsfile.js命令启动该程序。但是如果程序中有东西出错,这个进程就会退出。我们写程序不可能保证万无一失,肯定有些没有处理的错误,这就让很多人觉得NodeJS不稳定,容易产生很多故障。 下面我就讲讲几种方法增加你的NodeJS程序的稳定性。 <br/> <br/>1.使用 try{…} catch(error){…} 来执行容易出错的代码段。比如解析一个外来的json字符串等。 <br/>2.使用 process.on(‘uncaughtException’, function(err){…}); 来处理未被捕捉的错误。 <br/>3.试用奶妈进程来启动你的程序,检测子进程的退出,然后自动重启该进程。比如 mother.js : <br/><div> <br/><pre escaped=“true” lang=“javascript”>start(); <br/>function start() <br/>{ <br/> console.log(‘Mother process is running.’); <br/> var ls = require(‘child_process’).spawn(‘node’, [‘server.js’]); <br/> ls.stdout.on(‘data’, function (data) <br/> { <br/> console.log(data.toString()); <br/> }); <br/> ls.stderr.on(‘data’, function (data) <br/> { <br/> console.log(data.toString()); <br/> }); <br/> ls.on(‘exit’, function (code) <br/> { <br/> console.log('child process exited with code ’ + code); <br/> delete(ls); <br/> setTimeout(start,5000); <br/> }); <br/>}</pre> <br/></div> <br/><div>4.使用 nohup 让nodejs进程在后台运行。 比如运行"nohup node yourjsfile.js > /dev/null &"</div> <br/>  <br/> <br/>欢迎大家补充。

9 回复

最近正被nodejs稳定性困扰,前两个办法似乎都不能解决我的问题。 <br/>由于nodejs中很多处理都是异步的,try…catch对于callback中的error无能为力。 <br/>第2个办法我已经用了,但程序依然会毫无征兆地退出,uncaughtException的callback没有执行。 <br/>启动参数加了–trace_exception也不管用,不知道还有没有其它方法?

uncaughtException是个不得已的方法,不建议太依赖它,该容错的地方还得老老实实try … catch。 <br/> <br/>callback里异常的捕获确实麻烦,因为try … catch 只能抓到同一个ticket中的异常,而callback属于不同的ticket。这种情况只能在callback函数内部try…catch

谢谢回答。 <br/>uncaughtException主要是用来debug,以便有机会找到异常原因并修复。 <br/>其实我想问nodejs(或v8)有哪些debug/profiling方法,我的一个程序每运行N天左右异常退出,且没有stack trace,普通的单步调试方法基本上找不到错误原因。想解决这样的问题。 <br/> <br/>后来发现有一个v8启动参数: node --stack_trace_on_abort <br/>但得到的错误信息非常少,需要进行更多的profiling才能找到错误根源。

完全可以使用cluster或者forever之类的工具来启动并保持server进程哪

通过mutil-node多启动几个也可以增加稳定性

可以试下这个forever 模块,https://github.com/nodejitsu/forever ,这里有篇介绍文档http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever。

可以试试monit,比forever,supervisor之类的更强大一些,而且是在进程外部监控的,更简单可依赖

回到顶部