nodejs Error 疑问?

我们使用node app.js 启动服务。
当应用中出现错误的时候 我是这样处理的:

if(err) throw err;//看到好多node程序都是这样处理

或者自定义错误:new Error('error message')

当出现错误时,服务就会终止。
我的重新执行 node app.js

但是如果在生产环境中的话。程序肯定难免会出现错误(即会执行throw err)

总不可能自己重新发布吧!

这个问题该怎么处理。

阅读 9.4k
3 个回答
  1. 对于可能出问题的代码块多使用try{}catch(){}对异常进行主动的处理,别throw出去就不管了
  2. 开发和维护过程中应该坚持优化程序逻辑,减少error的出现,比如JSON.parse了一个空的字符串,产生了一个error,正确的做法是应该先对字符串进行基本的合法性判断
  3. 使用process.on('uncaughtException', function (err) {logger.error(err);});记录下你未在1中处理的error,尝试在2中的方法解决
  4. 对于依然无法捕获和处理的异常,建议结合node的domain模块来处理,推荐博文:Node.js 异步异常的处理与domain模块解析

对于保持node服务的稳定性,在保证代码本身的可靠性基础上,可以使用一些第三方的服务监控软件来实现自动化,比如:nodemon、forever、monit等等,有兴趣了解的话自行Google吧。

一般做法是使用自动重启服务,以下是一些相关工具:

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);
    });
};

补充:一个管理nodejs进程的模块 pm2

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题