Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Node.js如何处理健壮性

Node.js如何处理健壮性

作者头像
蛋未明
发布于 2018-06-07 07:52:09
发布于 2018-06-07 07:52:09
1.1K00
代码可运行
举报
文章被收录于专栏:蛋未明的专栏蛋未明的专栏
运行总次数:0
代码可运行

在极客教育出版了一个视频是关于《Node.js 异常处理-健壮性》,本文章主要是从内容上介绍如何来处理Node.js异常问题。如果希望学习可前往极客学院:http://www.jikexueyuan.com/course/2373.html

本文章的关键词 - 进程退出 - 内存泄漏 - domain安全保护


Node.js 异常的危害

很多初学的同学很少会关注Node.js的服务安全问题,而当服务器在生成环境遇到此类问题时,又会显得速手无策,因此在学习Node.js的初期了解其常见的危害事关重要。Node.js异常带来的危害主要包含两个方面,一个是来自服务器长期的危害,一个则来自服务的致命危害。

服务器致命危害

这里主要说的是由于代码健壮性问题,常常会由于局部的代码问题,导致整个服务功能异常退出,可简单说明为一个用户的异常请求,会影响到整个服务的功能,一个用户会将整个服务失效。最常见的莫过于代码中包含一些异常逻辑,或者一些隐藏的不常调用的触发逻辑导致的生成环境问题。

长期服务危害

由于Node.js是一个常驻内存的server,因此会由于小部分代码泄漏或者小部分句柄未关闭,当服务器请求累积到一定的程度的时候,就会导致服务器的句柄或者内存达到服务器限制,从而必须重启服务才可继续提供用户服务,而在这重启的过程中,往往会导致一些不可预知的问题。

既然有上面的两种比较严重的危害,那么我们应该在哪些场景中注意这些问题呢?

常见的 Node.js 异常逻辑

这里主要是提出一些可能出现异常逻辑的代码,对于初学者可借鉴,如果你是有经验的童鞋请忽略。主要看下面几段代码逻辑。

Node.js的变量异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var c = a + b;
var a = {'t' : 1}
console.log(a.t);
console.log(a.w);
console.log(a.w.r);

上面一段代码中console.log(a.w.r);这部分代码就会导致服务器的进程异常退出,首先前面两个console.log都是正常的,即使说a.w为null其实也是不会导致代码异常,但是如果使用null.r的话,因为null对象并非包含r属性,因此这部分会抛出Node.js异常,从而会导致整个服务的异常。 对于这点来说我们最好的处理办法就是在使用变量时候最好做一次属性检查,避免出现null.属性的问题,也就是可以优化为如下方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var objArr = [{'test':1}, {'test':2}];
objArr[0]['test'];
objArr[2];
if(typeof objArr[2] == 'object'){
    console.log(objArr[2]['test']);
} else {
    console.log('it is not a object');
}

当然对于对象属性检查也是一样的,如下代码会导致异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var testErrObject = 'dasdasd';
JSON.stringify(testErrObject);

可优化为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var testObject = {'test' : 1};
if(typeof testObject == 'object'){
    console.log(JSON.stringify(testObject));
} else {
    console.log('it is not a object');
}

var testString = '{"key" : "test is a test"}';
if(typeof testString == 'string'){
    console.log(JSON.parse(testString));
} else {
    console.log('it is not a string');
}

以上就是Node.js的变量异常。

Node.js的函数以及调用异常

函数异常主要是在定义时候,以及调用时候。

未申明

在Node.js中如果函数未申明则调用就会很容易出现异常,但是这种错误一般在开发阶段就会发现。对于这种情况我们常见的是在一个module中定义一个未export的函数,而在其他module中调用才会发生。

函数回调异常

这里主要还是针对Node.js中的异步函数,异步函数都是在异步回调中处理返回结果,但是经常会有同学同步的去获取执行结果,导致一直未得到正确的返回,而有些时候这种错误不会被发现,但是当现网运行时会由于某些用户的操作触发该问题。当然下面的代码就是初学者必须要了解的,一般有所经验的Node.js开发者都不会出现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');
var fileData = fs.readFile('./test.txt', function(err, data){

});
console.log(fileData);

上面就是场景的一些异常问题,既然存在问题,那么我们就想想如何去处理这些异常问题。

保证 Node.js 健壮性的方案

这里主要是针对代码异常做的一个健壮性,对于Node.js内存异常的问题,我们会下节课进行讨论分析。 我们来看看三种常见的方案

常见保护逻辑

这里主要是针对一些低级的变量异常、对象调用异常问题,这部分主要的处理就是在调用前进行相应的检测判断,特别是对于对象和数组调用的时候,避免这种异常错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
var obj = {'1' : '1', '2' : '2', '3' : '3'};

console.log(arr[4]);
console.log(obj[4]);

var objArr = [{'test':1}, {'test':2}];
objArr[0]['test'];
objArr[2];
objArr[2]['test'];

前面也介绍了处理方法,上面是调用异常问题,如果我们在调用test属性时,先进行判断再调用就不会出现严重异常问题,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var objArr = [{'test':1}, {'test':2}];
objArr[0]['test'];
objArr[2];
if(typeof objArr[2] == 'object'){
    console.log(objArr[2]['test']);
} else {
    console.log('it is not a object');
}

通用的保护逻辑try catch

try catch的话可以针对所有非异步执行代码的异常问题,只要是在同步调用函数中出现异常,都可以使用try catch来保护,但是对于异步回调函数中如果出现异常时,外层的try catch就无法捕获,因此如果使用try catch保护就会做的很繁琐。 首先我们看一个try catch保护逻辑的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try{
    callErr();
}catch(err){
    console.log(err);
}

function callErr(){
    var s = wrong + true;
    console.log(someSth);
}

上面一段代码中callErr就是一个同步异常代码,这里使用try catch就可以很好的捕获,并且不会导致服务的异常退出。但是如果是如下示例代码时,就会显得有些无力了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try{
    callErr();
}catch(err){
    console.log(err);
}

function callErr(){
    setTimeout(function(){
        var s = wrong + true;
        console.log(someSth);
    }, 10);
}

如上代码,如果我们还是希望使用try catch来做保护应该怎么做呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try{
    callErr();
}catch(err){
    console.log(err);
}

function callErr(){
    setTimeout(function(){
        try{
            var s = wrong + true;
            console.log(someSth);
        }catch(err){
            console.log(err);
        }
    }, 10);
}

虽然上面代码可以解决问题,但是细心的同学可以看到,如果去处理异常会让人奔溃,那么如何才能优雅的处理这种异步回调中的异常捕获呢?

domain的深层次保护

既然大家看到了上面的问题,那么最佳的方案就是使用domain来解决这种异步异常捕获问题。那么如何应用domain来处理呢?请看下面示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var domain = require('domain');
var d = domain.create();
d.on('error',function(err){
    console.log(err);
});
function callErr(){
    setTimeout(function(){
        var s = wrong + true;
        console.log(someSth);
    }, 10);
}
d.run(function(){
    callErr();
})

非常的简单,就是将需要保护的代码逻辑包裹在d.run的回调函数中即可,这样可以保证整个服务运行期间这部分调用逻辑安全,我最新的myweb2.1就是使用domain来保护整个逻辑的安全。

整体上这部分健壮性的就介绍完了,本次介绍的重点是如何保证服务器的代码逻辑异常,避免代码异常导致的服务器进程退出,关于服务器运行时安全的问题,我们将在下一个视频课时出来以后我这边再做相应的文章编写。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年01月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何成为一名优秀的 Java 程序员
许多Java开发人员问我:"如何成为一个更好的程序员?" ,"我如何提高自己的编程技能?" 或者 "我擅长Java开发,但不擅长解决问题的技巧"等,这是大多数程序员的现状。 在这行有很多编程语言专家
开发者技术前线
2020/11/23
5910
如何成为一名优秀的 Java 程序员
如何从一名普通的程序员进阶成为一名优秀的程序员
本文将讲述8种方式帮助你如何从一名普通的程序员进阶成为一名优秀的程序员,让我们就从此时此刻开始提高自己的开发技能吧。
一墨编程学习
2018/09/14
3840
如何从一名普通的程序员进阶成为一名优秀的程序员
如何成为一名优秀的程序员
本文章并非本人创作,是我在一个国外博客中偶然看到,当时在找为什么要读源码时偶然发现这个文章,觉得内容不错便翻译过来让大家看看,底部会有原文链接
Coder昊白
2023/11/23
2480
如何成为一名优秀的程序员
怎么才算一个合格的程序员?【大牛经验】
产品经理经常改需求这是程序员最头疼的事情,作为程序员应该也站在PM的角度思考,帮助PM分析出本质的需求,这也许可以减少需求的变更。当然,前提是得干一行爱一行,需要对业务有一定的了解。 先思考后行动 写代码的时候先想清楚了再下笔,而不是先写出一堆代码,然后在开始修bug。 休bug的时候,多看看上下文,搞明白为什么出bug,修改这个bug可能带来的影响,然后再修改。反面教材有两种:第一种随便改改就把代码改好了,但自己心里并不清楚为什么这样修改就修好了,撞运气,也许还有其他同样的bug也发现不了。另一种就是,头痛医头脚痛医脚,不仔细评估修改的影响,这样往往会引入新的问题。 程序员成长的一个办法就是修bug,修别人用不了的bug,但前提是搞清楚bug的缘由,这样才能避免类似的错误,有所收获。 顺畅沟通 不是巧如舌簧、也不是忽悠达人。需要的只是耐心倾听,然后清晰表达自己的意见。 现在的软件开发,已经不再是单打独斗的年代,大多数的软件、产品都需要多人、多部门的协作。而交流、沟通是非常耗时耗力的。沟通之前,先想好目标,组织好语言,尽量不要发散、不要跑题,对事不对人。对于重要的事情,保留沟通记录,最好有邮件,免得说不清。 沟通是门复杂的艺术,最基本是听明白、说清楚。 管理好自己的暴脾气
Java帮帮
2018/09/29
7600
怎么才算一个合格的程序员?【大牛经验】
邱俊涛:如何成为一名优秀的程序员?
关于作者 邱俊涛,ThoughtWorks咨询师,著有《JavaScript核心概念及实践》,《轻量级Web应用开发》等技术书籍。 本文转载自:http://icodeit.org/2017/07/tips-for-newbies/ 0写在前面 作为一个从业快10年的程序员,我想给新入行的程序员一些建议。这些建议是我希望自己可以在毕业的时候就读到的,也希望它们可以帮助你成为一个更好的程序员。 简单归纳一下,总共有7条: 保持健康 编程之外的爱好 持续学习 正确应对犯错 不要囿于角色 展示你的创意 刻意练习手
用户1097444
2022/06/29
4730
邱俊涛:如何成为一名优秀的程序员?
如何才能修炼成一名不可替代的程序员?
如何才能修炼成一名不可替代的程序员,看到这个标题我产生了一个疑问?这个世界上存在绝对不可替代的职位吗?
再见孙悟空_
2023/02/10
5840
如何才能修炼成一名不可替代的程序员?
一名合格的程序员应该是什么样子
6 月 25 号,母亲打来电话,说妹妹的高考成绩离二本线差 9 分。我听完随口扔了一句,“在我的意料之中。”因为她平时的成绩也就在二本线上下徘徊。
沉默王二
2019/07/10
3840
【大牛经验】如何成为一名优秀的全栈工程师
如何成为一名优秀的全栈工程师 什么是全栈工程师 全栈工程师一词,最早出现于Facebook工程师Calos Bueno的一篇文章 - Full Stack (需fanqiang)。他把全栈工程师定义为对性能影响有着深入理解的技术通才。自那以后全栈这个词便流行起来,我看到过的就有全栈工程师,全栈设计师,全栈运维,全栈市场营销人员等等。而在“拉钩”,“100Offer”等针对互联网人才的招聘网站上,全栈工程师更是一跃成为热门招聘职位,其薪资水平也比一般的开发工程师职位要高出一截。那么,什么是全栈工程师
Java帮帮
2018/03/19
1K0
如何成为优秀程序员?
同事和粉丝们很多人都让我莫名的认为我是一名非常资深厉害的程序员。我觉得可以分享一下,自己多年如一日的编程“思维”。
JavaEdge
2024/05/25
880
一名普通的程序员进阶成为伟大程序员有哪8种途径?
本文作者讲述了8种方式帮助你如何从一名普通的程序员进阶成为一名伟大的程序员,让我们就从此时此刻开始提高自己的开发技能吧。 是时候开始认真考虑一下如何升级你的开发技术了。让我们来认真地学习一下吧。 给自己设定一个提高开发技术的目标很容易,但是“想成为一名伟大的程序员”却不是一个容易实现的目标。首先,说“我想变得更好”,是建立在你认识到“更好”的样子基础之上。另外,有太多的人追求进步而不知道如何去实现。 因此,让我分享八个可实际操作的指导方针,你可以把它们作为提高编程技能的流程图。这些智慧都是伴随着计算机3
CSDN技术头条
2018/02/13
1.2K0
一名普通的程序员进阶成为伟大程序员有哪8种途径?
做为一名java高级程序员,这些IT岗位你都了解么?
程序员   程序员,英文名coder/programmer,大家常自嘲叫码农的阶段。这个角色职责是把需求或产品实现为用户可用的软件产品。   此职位为执行级别。另外因为经验较少,一般需要求助别人,或与别人一起完(ban)成(zhuan)一个任务。   此阶段大概要经历3年,程序员的职责如下:   1、负责公司运营系统的设计与开发工作   2、运营数据处理和分析 高级程序员   高级程序员学名工程师。到了这个level,英文名可改叫做engineer或developer。此时你的功力开始增强,这与你平时的积累
三哥
2018/06/15
7080
如何成为一名优秀的数据工匠?
盖国强:「数据工匠」这是一个非常有意思的话题,在我的理解里,工匠首先意味着“精深”,钻研一个领域达到精深的境界才能称之为工匠。
腾讯云开发者
2020/08/20
2.8K0
程序员没朋友?删注释,学甩锅,这么干就对了!
昨天我分享了一篇关于收入的个人感悟,没想到如此受欢迎,得到了很多大佬以及读者的点赞。
程序员小浩
2020/11/19
1.3K1
程序员没朋友?删注释,学甩锅,这么干就对了!
如何成为一名受欢迎的程序员直播者?
在全民直播的时代,你作为程序员也不甘寂寞,投身直播的滚滚浪潮中,成为编程直播者。但为什么有些人的直播很受欢迎,而自己的直播或视频的观众却寥寥无几呢?在livecoding.tv 最新发布的博客中,为直播者用户提出了以下10条建议,你也不妨参考一下:
LiveEdu
2018/05/21
7610
如何成为一名受欢迎的程序员直播者?
真的要做一辈子的程序员吗?来自10年程序员的心声
经常听一些同学说:不知道下一份工作该去哪类公司做些什么,我的职场人际一团糟老板不重视我,我现在成长的非常慢所以又想跳槽了,我看不到公司的发展前景好迷茫,其实这一切的困惑都来源于没有做好职业规划或者你根本就没有职业规划过。
一墨编程学习
2018/09/14
2.2K0
真的要做一辈子的程序员吗?来自10年程序员的心声
企业为什么需要雇佣一名老程序员
经验 老程序员可能无法像25岁时那样,在脑子里保存那么多的代码,但这些人的经验非常丰富。我们知道,每一套系统的规模都在越来越大,大到最后都超过了你的脑容量——无论你的脑袋有多大——所以说能不能记住代码
码神联盟
2018/04/02
7350
企业为什么需要雇佣一名老程序员
鹅厂一线专家:如何成为一名靠谱的程序员(上)
本文基于我十多年程序员生涯观察,落笔始于 2019 年学习怎么带领团队新人时,在此之前我一直在想,如果当年有人告诉我这些道理,我是不是可以发展得更好,也少一些纠结。
腾讯大讲堂
2024/01/26
5640
鹅厂一线专家:如何成为一名靠谱的程序员(上)
如何成为一名优秀的iOS开发工程师
如果你是一位专业的iOS开发工程师,你应该为自己感到自豪。因为你能在强大的iOS系统下,一展身手实现自己和他人的想法,这是一件令人无比激动的事情。 作为一名iOS开发工程师,你一定想成为行业的佼佼者。那么,如何成为一名优秀的iOS开发工程师呢?我觉得做到以下几点,你就离优秀越来越近了。 提高英语水平 作为码农,英语水平虽然不是一个硬指标,但是,如果你的英语水平足够好,那真是如虎添翼。在公司里面,糟糕的英语表达能力也掩盖了你在软件开发技术上的优势。 很多优秀的技术文章都是英文版本的,就像苹果官方文档一样,
BestSDK
2018/02/26
7530
如何成为一名优秀的iOS开发工程师
写给即将离开校园成为一名程序员的几句忠告
写给即将离开校园成为一名程序员的几句忠告 转眼间又到了一年一度的毕业季,如今回首自己真正意义上的大学生活已过去整整两个春秋.谨以此文献给那些即将毕业的和还未毕业的学弟学妹们. 这篇博客的标题定的很大
用户1289394
2018/02/27
6930
写给即将离开校园成为一名程序员的几句忠告
一名优秀的产品经理
摘要:  如今,用户体验这个词已经渗透到越来越多的行业,贯穿于整个企业的研发、推广和市场运作。例如,买 iPhone,从打开包装盒的一刹瞬间;到海底捞吃货,从热情洋溢的引座员接待你的那一刻,体验之旅开始展开。可以毫不夸张地说,用户体验是促进销售的生产力。
阳光岛主
2019/02/19
3500
一名优秀的产品经理
推荐阅读
相关推荐
如何成为一名优秀的 Java 程序员
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验