node.js - nodejs Error 疑问?
大家讲道理
大家讲道理 2017-04-17 11:05:46
[Node.js讨论组]

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

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

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

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

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

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

这个问题该怎么处理。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号