Loading [MathJax]/jax/output/CommonHTML/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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Node.js 十大常见的开发者错误
自 Node.js 面世以来,它获得了大量的赞美和批判。这种争论会一直持续,短时间内都不会结束。而在这些争论中,我们常常会忽略掉所有语言和平台都是基于一些核心问题来批判的,就是我们怎么去使用这些平台。无论使用 Node.js 编写可靠的代码有多难,而编写高并发代码又是多么的简单,这个平台终究是有那么一段时间了,而且被用来创建了大量的健壮而又复杂的 web 服务。这些 web 服务不仅拥有良好的扩展性,而且通过在互联网上持续的时间证明了它们的健壮性。
coder_koala
2019/08/28
1.3K0
Node.js 的错误处理机制
Node.js的API主要有两种风格,同步和异步,如何区分呢,大部分异步API一般都有一个回调函数 callback 作为其参数,而大部分同步API则不会,例如:
conanma
2022/01/05
2.1K0
Node.js内存泄漏分析
在极客教育出版了一个视频是关于《Node.js 内存泄漏分析》,本文章主要是从内容上介绍如何来处理Node.js内存异常问题。如果希望学习可前往极客学院:http://www.jikexueyuan.com/course/2561.html 本文章的关键词 - 内存泄漏 - 内存泄漏检测 - GC分析 - memwatch ---- 文章概要 由于内存泄漏在Node.js中非常的常见,可能在浏览器中应用javascript时,对于其内存泄漏不是特别敏感,但作为服
蛋未明
2018/06/07
2.5K0
Node.js快速入门
下载最新版源码:https://nodejs.org/dist/v6.9.5/node-v6.9.5.tar.gz
程裕强
2022/05/06
11.5K0
Node.js 中使用 fs 模块进行文件读写操作详解
在现代 Web 开发中,Node.js 以其独特的非阻塞 I/O 和事件驱动架构,已经成为服务器端开发的首选平台之一。而在 Node.js 的核心模块中,fs(文件系统)模块扮演着至关重要的角色。它提供了丰富的 API,使得开发者能够轻松地进行文件的读取、写入、追加、复制和删除等操作。本文将深入探讨 fs 模块的使用方法,通过详细的示例代码,帮助读者掌握在 Node.js 环境下进行文件操作的基本技能。
Front_Yue
2024/12/25
4420
Node.js 中使用 fs 模块进行文件读写操作详解
Node.js 基础入门
Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境
王秀龙
2021/08/23
1.5K0
Node.js 基础入门
node.js基础入门
node.js是一个基于Google V8引擎的、跨平台的JavaScript运行环境,不是一个语言
黄啊码
2022/06/20
7830
Node.js异步编程进化论
我们知道,Node.js中有两种事件处理方式,分别是callback(回调)和EventEmitter(事件发射器)。本文首先介绍的是callback。
童欧巴
2020/03/28
8840
Node.js异步编程
1. 同步API,异步API //路径拼接 const public = path.join(_ dirname, 'public') ; //通过返回值拿到 //请求地址解析 const url0bj = url. parse (req. ur1) ; //通过返回值拿到 //读取文件 fs. readFile(' ./demo.txt', 'utf8', (err, result) => { console .1og (result) ; }) ; //通过函数方式拿到 同步API:只有当前
清出于兰
2020/10/29
1.9K0
Node.js异步编程
使用 Node.js 实现文件流转存服务
本文章所有的例子都采用 ES6 编写,可以直接用node version 6.x 以上直接运行,低版本的 node 可以使用 babel 或者 typescript 编译器编译之后再运行。
coder_koala
2021/03/11
3.4K0
使用 Node.js 实现文件流转存服务
【Node.js】01 —— fs模块全解析
另外,Node.js 还提供了诸如 fs.readdir()(异步读取目录内容)和 fs.readdirSync()(同步读取目录内容)等方法,用于枚举指定目录中的文件和子目录。同时,还有 fs.promises.readdir() 提供基于Promise的异步API。
空白诗
2024/06/14
4160
node.js异步请求大坑
前段时间写Node.js执行mysql的时候踩了个大坑,大概就是nodejs请求Mysql数据表中的数据,返回以后,如果匹配正确就向另一个数据表中写数据。
SimpleAstronaut
2022/09/21
2.3K0
【读书笔记】《深入浅出 Node.js》
[《深入浅出 Node.js》] 读书笔记。 # 缘起 最初的目标是写一个基于事件驱动、非阻塞 I/O 的 Web 服务器。考虑高性能、符合事件驱动、没有历史包袱选择了 JavaScript。 # 特点 异步 I/O 事件与回调函数 事件优势:轻量级、松耦合、只关注事务点 单线程 优点 无需像多线程在意状态同步问题,没有死锁的存在 无线程上下文交换带来的性能上的开销 弱势 无法利用多核 CPU 错误会引起整个应用退出,应用的健壮性值得考验 大量计算占用 CPU 导致无法继续调用异步 I/O Node
Cellinlab
2023/05/17
8490
【读书笔记】《深入浅出 Node.js》
【Node.js】一个愚蠢的Try Catch过错
宋凯伦
2018/01/04
1.6K0
【Node.js】一个愚蠢的Try Catch过错
Node.js进阶之进程与线程
进程与线程在服务端研发中是一个非常重要的概念,如果您在学习的时候对这一块感到混乱或者不是太理解,可以阅读下本篇内容,本篇在介绍进程和线程的概念之外,列举了很多 Demo 希望能从实战角度帮助您更好的去理解。
五月君
2019/07/12
1.2K0
Node.js进阶之进程与线程
《深入浅出Node.js》:Node异步编程解决方案 之 事件发布-订阅模式
灵活掌握函数式编程,异步编程就有了得心应手的基础。之所以说是基础,是还需要对异步的编程思路有清晰的认识。
前端_AWhile
2019/08/29
1.4K0
《深入浅出Node.js》:Node异步编程解决方案 之 事件发布-订阅模式
如何在2016年成为一个更好的Node.js开发者
本文主要讨论一些进行Node.js开发的最佳实践和建议,这些建议不仅仅适合开发者,还适合那些管理与维护Node.js基础架构的工作人员。遵循本文提供的这些建议,能够让你更好的进行日常的开发工作。 Statement 原文地址:https://blog.risingstack.com/how-to-become-a-better-node-js-developer-in-2016/ 译者:景庄,Web开发者,主要关注JavaScript、Node.js、React、Docker等。 使用ES2015 在201
春哥大魔王
2018/04/17
7200
如何在2016年成为一个更好的Node.js开发者
《Node.js 极简教程》 东海陈光剑
Once you have installed Node, let's try building our first web server. Create a file named "app.js", and paste the following code:
一个会写诗的程序员
2019/02/22
1.5K0
《Node.js 极简教程》  东海陈光剑
Node.js学习笔记(二)——Node.js模块化、文件读写、环境变量
(1)、在浏览器端使用var或不使用关键字定义的变量属于全局作用域,也就是可以使用window对象访问。
张果
2022/09/28
6.4K0
Node.js学习笔记(二)——Node.js模块化、文件读写、环境变量
深入理解Node.js 进程与线程(8000长文彻底搞懂)
进程与 线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过Node.js 的角度讲解 进程与 线程,并且讲解一些在项目中的实战的应用,让你不仅能迎战面试官还可以在实战中完美应用。
coder_koala
2019/08/08
2.6K0
深入理解Node.js 进程与线程(8000长文彻底搞懂)
相关推荐
Node.js 十大常见的开发者错误
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验