素材牛VIP会员
nodejs Error 疑问?
 路***过  分类:Node.js  人气:924  回帖:3  发布于2年前 收藏

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

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

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

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

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

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

这个问题该怎么处理。

 标签:node.js

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv1 新人
kg***25 页面重构设计 2年前#1

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

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);
    });
};
Lv6 码匠
15***57 UI设计师 2年前#2
  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吧。

Lv1 新人
kg***25 页面重构设计 2年前#3

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取