我们使用node app.js 启动服务。
当应用中出现错误的时候 我是这样处理的:
if(err) throw err;//看到好多node程序都是这样处理
或者自定义错误:new Error('error message')
当出现错误时,服务就会终止。
我的重新执行 node app.js
但是如果在生产环境中的话。程序肯定难免会出现错误(即会执行throw err)
总不可能自己重新发布吧!
这个问题该怎么处理。
我们使用node app.js 启动服务。
当应用中出现错误的时候 我是这样处理的:
if(err) throw err;//看到好多node程序都是这样处理
或者自定义错误:new Error('error message')
当出现错误时,服务就会终止。
我的重新执行 node app.js
但是如果在生产环境中的话。程序肯定难免会出现错误(即会执行throw err)
总不可能自己重新发布吧!
这个问题该怎么处理。
一般做法是使用自动重启服务,以下是一些相关工具:
Node.js专属
Forever https://github.com/nodejitsu/forever
Linux/Unix工具
Supervisord: http://supervisord.org/
Upstart: http://upstart.ubuntu.com/
Monit: http://mmonit.com/monit/
Daemontools: http://cr.yp.to/daemontools.html
Launchtool: http://people.debian.org/~enrico/launchtool.html
但是,个人不建议throw异常出去,因为每次nodejs服务器重启都可能导致一些未知的情况——文件没写完、数据库没写完、数据丢失等等。
我们的做法是,如果有需要继续回调的,将err直接传入下一个回调推迟处理,直至最终业务层,例如:
Figure.random = function(fn) {
this.find({}, function(err, figures) {
if (err) return fn(err); // 这一行处理错误,fn是client的回调函数
...
return fn(null, figure[0]);
});
};
而最终业务层(一般是返回HTTP Response的地方)可能是这样的:
exports.random = function(req, res) {
Figure.random(function(err, figure) {
if (err) return res.send(500, err); // 按照发生异常的情况通知客户端,例如没找到资源就是404,冲突就是409,莫名其妙的问题就是500
...
return res.send(200);
});
};
5 回答4.8k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
5 回答1.9k 阅读
2 回答1.3k 阅读✓ 已解决
3 回答2k 阅读
1 回答3.2k 阅读
try{}catch(){}
对异常进行主动的处理,别throw出去就不管了JSON.parse
了一个空的字符串,产生了一个error,正确的做法是应该先对字符串进行基本的合法性判断process.on('uncaughtException', function (err) {logger.error(err);});
记录下你未在1中处理的error,尝试在2中的方法解决对于保持node服务的稳定性,在保证代码本身的可靠性基础上,可以使用一些第三方的服务监控软件来实现自动化,比如:nodemon、forever、monit等等,有兴趣了解的话自行Google吧。