新書推薦:
《
海洋、岛屿和革命:当南方遭遇帝国(文明的另一种声音)
》
售價:NT$
485.0
《
铝合金先进成型技术
》
售價:NT$
1214.0
《
英雄之旅:把人生活成一个好故事
》
售價:NT$
398.0
《
分析性一体的涌现:进入精神分析的核心
》
售價:NT$
556.0
《
火枪与账簿:早期经济全球化时代的中国与东亚世界
》
售價:NT$
352.0
《
《全面与进步跨太平洋伙伴关系协定》国有企业条款研究
》
售價:NT$
449.0
《
银行业架构网络BIAN(全球数字化时代金融服务业框架)(数字化转型与创新管理丛书)
》
售價:NT$
449.0
《
金托邦:江湖中的沉重正义
》
售價:NT$
275.0
|
編輯推薦: |
1、本书摒弃传统的说教模式,每段代码都是单独的功能型页面,读者可以从全书的任意一点开始线性阅读。
2、本书的目的就是将*有用的代码与读者分享,包含了服务器设计人员在实战中必须具备的所有技巧和方法,读者可以拿来就用。
3、本书300余段代码也许并不是**的代码,但笔者提供了Github地址,与全世界IT工程师一起优化了这些代码,并实现了更新迭代,以保证读者始终能看到**的、**效的、*实用的Node代码段。
4、这是一本市场上****的Node实战书,是一本值得拥有的Node设计书。
|
內容簡介: |
本书精选300余段Node.js代码,涵盖了服务器端脚本开发中的绝大多数要点、技巧与方法,堪称***实用的Node.js框架开发方面的参考书籍,是网站建设与服务器端开发人员的好帮手。本书的代码跨平台、跨设备、跨浏览器,充分向读者演示了如何使用Node.js框架的各项技术。
本书从Node.js框架的使用原理与应用场景出发,对*实用的Node.js代码段进行了全方位的介绍和演示。全书分为15章,包含控制台、模块和包管理、异步IO与Async流程控制库、Buffer、进程管理、子进程通信、OS操作系统、文件系统、路径处理、TCPUDP网络编程、流(Stream)、Web开发、常用工具及MySQL与MongoDB数据库交互等Node.js框架技术的内容,对提高网站建设与服务器端开发人员的Node.js技术水平有着非常重要的指导作用。
本书内容简洁明了、代码精练、重点突出、实例丰富、语言通俗易懂、原理清晰明白,是网站建设与服务器端开发人员的良好选择,同时也非常适合大中专院校学生学习阅读。
|
關於作者: |
周敏,6年互联网、4年Web前端开发经验,从事过产品、前端、后端等职务,技术娴熟,一专多能,如LNAMP平台的开发、软件架构、设计模式、HTML 5、JavaScript、CSS等。目前在某著名网站担任全栈工程师,特撰写此书,以帮助更多的初学者学习前、后端的合作开发模式,学习全栈工程师的一些工作技巧。
|
目錄:
|
第1章 Node.js控制台模块应用1
1.1 Node.js版之“Hello World”程序1
1.2 日志输出与信息输出功能3
1.3 字符串格式化的应用5
1.4 数值型格式化的应用6
1.5 JSON数据交换格式应用7
1.6 测试特殊运算符如何取值8
1.7 特殊格式化参数应用9
1.8 斐波那契(Fibonacci)数列应用10
1.9 错误与警告提示应用11
1.10 重定向标准错误输出流12
1.11 查看Node.js对象的属性和方法13
1.12 时间计时器应用14
1.13 查看当前调用栈的方法16
1.14 对表达式结果进行评估17
1.15 读取命令行输入信息18
1.16 阶乘运算输出20
1.17 向控制台输出组合控制键22
1.18 模拟一个简单的控制台界面23
1.19 输出水仙花数26
1.20 输出质数27
1.21 打印输出杨辉三角28
1.22 汉诺塔(Hanoi)问题30
1.23 简单四则运算应用33
第2章 Node.js模块与包管理36
2.1 Node.js框架加载核心模块36
2.2 Node.js框架加载文件模块37
2.3 从node_modules文件夹中加载39
2.4 模块的循环调用问题40
2.5 module.exports对象应用42
2.6 module.exports对象与exports对象43
2.7 汇率换算实用程序45
2.8 简单计数器实用程序46
2.9 包管理之package.json详解49
2.10 基于包管理的四则运算应用52
第3章 Node.js异步IO与Async流程控制库58
3.1 Node.js框架异步机制基础58
3.2 Node.js框架异常捕获机制60
3.3 Async串行流程控制62
3.4 Async瀑布模式流程控制64
3.5 Async并行流程控制66
3.6 Async限制性并行流程控制67
3.7 Async循环流程控制69
3.8 Async队列流程控制72
第4章 Buffer模块处理75
4.1 定义Buffer对象的基本方法75
4.2 定义Buffer对象的特别方法77
4.3 如何判断Buffer对象79
4.4 获取Buffer对象字节长度80
4.5 读取Buffer对象82
4.6 写入Buffer对象84
4.7 Buffer对象转字符串86
4.8 Buffer对象裁剪88
4.9 拷贝Buffer对象89
4.10 正确拼接Buffer91
4.11 应用Buffer操作HTTP Request Header93
第5章 Node.js进程管理98
5.1 获取应用程序当前目录98
5.2 改变应用程序目录99
5.3 获取系统相关信息100
5.4 实现标准输出流105
5.5 实现标准错误流107
5.6 实现标准输入流108
5.7 Kill当前进程109
5.8 Process模块的异步方法111
第6章 child_process及进程通信113
6.1 使用spawn方法创建子进程113
6.2 使用exec方法创建子进程115
6.3 使用spawn方法绑定系统事件117
6.4 使用exec方法绑定错误事件118
6.5 创建子进程查看用户目录120
6.6 查看用户目录出现错误的处理方法122
6.7 查看物理内存使用状态123
6.8 查看子进程pid的方法125
6.9 创建子进程统计系统登录次数127
6.10 使用execFile方法创建子进程128
6.11 使用execFile方法绑定错误事件130
6.12 使用fork方法获取CPU信息131
6.13 使用fork方法实现进程间通信132
6.14 使用fork方法实现斐波那契数列134
第7章 OS模块应用138
7.1 获取当前操作系统类型与平台138
7.2 获取操作系统默认的临时文件目录139
7.3 获取操作系统主机名140
7.4 获取操作系统架构141
7.5 获取操作系统的发行版本142
7.6 返回操作系统运行时间143
7.7 获取操作系统内存状态145
7.8 获取CPU内核信息146
7.9 获取网络接口信息147
第8章 文件系统模块应用149
8.1 重命名文件149
8.2 打开与关闭文件152
8.3 截取文件内容155
8.4 修改文件长度156
8.5 获取文件信息158
8.6 更改文件所有权159
8.7 更改文件权限161
8.8 创建与删除文件硬链接163
8.9 创建文件符号链接165
8.10 读取文件符号链接168
8.11 相对路径转**路径169
8.12 创建与删除目录170
8.13 读取文件目录172
8.14 读文件的应用173
8.15 功能增强的读文件应用175
8.16 写文件的应用176
8.17 功能增强的写文件应用178
8.18 追加写入文件180
8.19 监控文件的应用182
第9章 路径处理应用185
9.1 规范化字符串路径185
9.2 合并字符串路径187
9.3 解析**路径188
9.4 解析相对路径189
9.5 获取文件夹路径191
9.6 获取路径中文件扩展名192
9.7 如何获取路径中*后部分193
9.8 解析与格式化url路径194
9.9 url路径转化196
9.10 url参数转化url对象197
第10章 TCPUDP网络应用199
10.1 创建基本的TCP服务器199
10.2 创建基本的TCP客户端201
10.3 创建简单的TCP通信应用202
10.4 创建TCP服务器的另一种方式206
10.5 服务器端绑定事件207
10.6 获取服务器地址参数210
10.7 获取当前服务器连接数211
10.8 获取套接字地址215
10.9 获取远程地址216
10.10 使用套接字写数据218
10.11 控制套接字数据流的应用221
10.12 创建UDP服务器225
10.13 创建UDP客户端227
10.14 创建简单的UDP应用229
10.15 UDP广播服务的实现233
10.16 模仿简单的聊天室应用236
第11章 Node.js流(Stream)应用241
11.1 创建可读(Readable)流241
11.2 测试可读readable事件处理244
11.3 使用data事件读取文件246
11.4 可读流错误事件处理247
11.5 暂停与恢复可读(Readable)流248
11.6 使用可读(Readable)流发送数据251
11.7 使用可读(Readable)流读取文件252
11.8 使用pipe方法实现复制文件253
11.9 解除pipe方法设置的流255
11.10 使用可写(Writable)流写文件257
11.11 可写(Writable)流drain事件处理258
11.12 可写(Writable)流finish事件处理260
第12章 Node.js Web开发263
12.1 构建一个基本的HTTP服务器263
12.2 编写一个简单的HTTP客户端265
12.3 HTTP响应状态码268
12.4 设定和获取HTTP头文件271
12.5 写HTTP头文件的方法273
12.6 发送与处理GET请求276
12.7 进行重定向操作278
12.8 服务器多路径处理方式281
12.9 模拟ping命令连接服务器284
12.10 安装Express开发框架286
12.11 使用Express开发框架开发的Hello World287
12.12 Express开发框架路由处理292
12.13 应用Express框架实现登录页面296
12.14 Express框架实现Ajax方式操作301
第13章 Node.js Util常用工具306
13.1 原型对象继承306
13.2 将任意对象转换为字符串308
13.3 验证是否为数组310
13.4 验证是否为日期格式310
13.5 验证是否为正则表达式311
13.6 验证是否为错误类型312
13.7 格式化字符串313
第14章 Node.js与MySQL交互315
14.1 连接MySQL数据库315
14.2 查询MySQL数据库317
14.3 插入MySQL数据库318
14.4 删除MySQL数据库320
14.5 更新MySQL数据库321
14.6 操作MySQL数据库连接池322
第15章 Node.js与MongoDB交互325
15.1 连接MongoDB数据库326
15.2 连接MongoDB数据集合328
15.3 查询MongoDB数据集合330
15.4 插入MongoDB数据集合333
15.5 删除MongoDB数据集合335
15.6 更新MongoDB数据集合336
|
內容試閱:
|
序1 Node.js的前世今生
这是一本是有显著特点的Node.js书,它涉及了脚本编程的技巧、脚本运行性能的优化、快速开发服务器的应用。所以本书不仅仅是你的帮助文档,更是你的良师益友,拥有这些代码,你将会在服务器脚本工作中战无不胜!
Node.js框架概述
Node.js是一个基于Google公司Chrome浏览器的JavaScript运行时建立的平台,主要用于搭建响应速度快、方便扩展的服务器Web应用。其实,Node本身就是一个JavaScript运行环境,是对Google V8引擎的完美封装。Google V8引擎执行JavaScript脚本的速度非常快、性能非常好,Node.js框架对它进行了优化,提供了相应替代的API,保证V8引擎在非浏览器环境下运行得更好。
Node.js框架基于事件驱动、非阻塞IO模型,因而得以轻量和高效,非常适合在分布式设备终端上运行数据密集型的实时应用。Node.js框架采用一套“非阻塞”IO库来支持事件循环的方式,更好地为文件系统、数据库之类的资源提供了接口。目前,由于Web服务器与富客户端浏览器应用程序之间共享代码的方法只能通过JavaScript脚本语言来实现,因此对服务器脚本语言支持*完美的Node.js框架发展十分迅猛,实际上已经成为了服务器端的JavaScript脚本语言开发平台。
更为重要的是,在Node.js框架发布以来的很短时间内,各大开源社区就已经贡献了大量的扩展库(模块),提供了对各种开源软件或数据库驱动的支持。因此,虽然Node项目还非常年轻,但众多的软件开发人员都对Node项目展现出了极大的热情,并贡献出了自己的一份力量,改进并完善了Node.js框架。
Node.js框架环境搭建
学习Node.js框架的**步,需要先搭建好其工作环境,这样才能运行并测试Node脚本文件。下面具体介绍一下。
(1)获取Node安装包,可以访问以下Node.js框架官方网址:
https:nodejs.orgdownload
在该页面中,可以看到适用于不同操作系统的、各个版本的Node安装包源文件,选中我们需要的版本类型直接下载就可以。
在Windows操作系统环境下安装Node.js框架,直接运行下载好的Node安装包源文件即可,目的路径一般选择如下:
D:nodejs
安装完毕后,读者可以到该目录下浏览一下具体内容,这样会对Node环境有一个大致的了解。
(2)在Ubuntu(Linux)环境下需要运行apt命令进行安装,具体方法如下:
sudo apt-get install nodejs
如果想获取**的Node安装源,具体方法如下:
sudo add-apt-repository ppa:chris-leanode.js
sudo apt-get update
sudo apt-get install nodejs
一般情况下,node命令会被自动安装在以下路径之中(视不同的Ubuntu系统版本而定):
usrlocalbinnode
大致经过以上这几步的操作,Node.js框架就安装完毕了,为了检验Node环境是否正确,可以使用以下命令来检测Node的版本:
node –v
如果显示出正确的版本号,则说明Node环境搭建成功了。
Node.js框架推荐工具
1.开发工具,平台类
(1)jetBrains公司的WebStorm开发工具
WebStorm是jetBrains公司开发的一款JavaScript开发工具,被众多JavaScript开发者作为**的开发平台,完全支持Windows、Linux、Mac OS X等操作系统,有“Web前端开发神器”的美誉。读者可以从下面的网址获取该工具:http:www.jetbrains.comwebstorm
(2)Sublime Text代码编辑器
Sublime Text是一款代码编辑器(支持C、Java、JavaScript、HTML、CSS等),同时也可以作为文本编辑器使用。Sublime Text具有漂亮的用户界面和强大的扩展功能,比如支持代码缩略图、各种工具插件、多窗口任务等功能。同时,Sublime Text也是一款跨平台的编辑器,完全支持Windows、Linux、Mac OS X等操作系统。读者可以从下面的网址获取该工具:http:www.sublimetext.com
(3)Eclipse Node.js IDE插件
对于已经习惯了使用Eclipse开发工具的读者来讲,可以使用Eclipse Node.js IDE这款插件来开发Node程序。读者可以从下面的网址获取该插件工具:
http:www.nodeclipse.org
(4)Node.js Tools for Visual Studio插件
如果读者习惯使用微软公司的Visual Studio系列开发工具,同样有一款Node.js Tools for Visual Studio插件可以提供对开发Node程序的支持。读者可以从下面的网址获取该插件工具:https:nodejstools.codeplex.com
2.测试调试工具类
(1)NodeUnit
NodeUnit是一款应用于Node.js的单元测试框架,基于assert模块开发,读者可以从下面的网址获取该测试工具:https:github.comcaolannodeunit
(2)Supervisor
如果希望在Node代码修改后立即看到效果,而不是每次都要重启Node服务才能看到效果,Supervisor调试工具可以帮助实现这个功能,它会监视代码的改动并自动重启Node服务。读者可以从下面的网址获取该测试工具:http:supervisord.org
(3)Mocha
Mocha是一款完整的测试工具,可安装在NPM和CI服务器之上。读者可以从下面的网址获取该测试工具:https:github.commochajsmocha
(4)should.js
should.js模块是assert模块的扩展,其语法与日常用的语法几乎一模一样,非常易于使用。读者可以从下面的网址获取该测试工具:https:github.comvisionmediashould.js
3.第三方开发包类
(1)Async异步处理
Async是一个流程控制工具包,提供了直接而强大的异步功能,该插件基于JavaScript语言专门为Node.js设计,同时也可以直接在浏览器中使用。读者可以从下面的网址获取该开发工具:https:github.comcaolanasync
(2)Express开发包
Express是一个简洁而灵活的Node.js Web应用框架,提供一系列强大特性,帮助我们创建各种Web应用。Express不对Node.js已有的特性进行二次抽象,只是在其之上扩展了Web应用所需的功能。Express开发包所具有的丰富的HTTP工具以及来自Connect框架的中间件可以为审计人员随取随用,并创建出友好的、快速且简单的API。读者可以从下面的网址获取该开发工具:https:www.npmjs.compackageexpress
(3)node-mysql开发包
node-mysq开发包是一个纯Node.js的用JavaScript实现的MySQL客户端程序。node-mysql封装了Node.js框架对MySQL的基本操作,拥有100%的MIT公共***。读者可以从下面的网址获取该开发工具:https:github.comfelixgenode-mysql
本书浏览器约定
本书涉及的浏览器测试基准如图1所示,可以看到内核和外壳的占有情况,内环为内核,外环为外壳,这也是接下来要提到的浏览器同类项的数据基础。
不同的浏览器可能会采用相同的内核(渲染引擎)。一方面,外壳实现的差异性会影响整个网站功能,这也是为什么内核无法完全代表所有浏览器的原因。另一方面,某些浏览器具有相同的血统,是可以归为同一类的,同一类中,如果测试通过其中一个,那么其他与之同类的浏览器也基本上可以通过测试。图1是根据相同的内核或对W3C标准有类似的支持程度对浏览器进行归类的。之所以这样做,是因为测试基准除了要基本反映浏览器的市场占有率,还要考虑到开发测试的成本。因此,测试基准中的浏览器应当具有典型代表性。
浏览器的不同版本的内核也不一样,因此通常要针对不同版本的浏览器做测试,开发者要了解内核对标准的支持,比如IE的渲染引擎Trident的不同版本差别较大,因此IE需要测试6~10的所有版本,然而由于Firefox和Chrome升级覆盖面广,因此基准中只保留其**版本。
本书涉及的代码会根据需要,对不同浏览器进行有针对性的测试。
序2 *简单却必须看的Node代码
Node代码基于JavaScript代码,却也有所不同,相信通过对本书的学习,读者会对Node技术爱不释手!下面介绍一些很简单、却又很有特点的Node代码。
1. 控制台运行Node代码的方法:
01 $ node
02 console.log''Hello Node!'';
03 Hello Node!
第01行代码运行Node环境;第02行代码调用Node.js框架的打印输出命令;第03行代码为控制台打印输出的结果。
2. 控制台运行Node脚本的方法:
01 $ node hello.js
02 Hello Node!
第01行代码使用Node命令运行hello.js脚本文件(脚本文件中代码同第1个例子中的第02行代码);第02行代码为控制台打印输出的结果。
3. 使用require命令加载模块的方法:
01 var http = require''http''; TODO: 加载核心模块‘http’
02 var circle = require''.ch02.module-file-circle.js'';
第01行代码使用require命令加载核心模块‘http’;第02行代码使用require命令加载自定义模块''.ch02.module-file-circle.js''。
4. 使用exports命令输出对象的方法:
01 exports.area = functionr {
02 return PI * r * r;
03 };
这段代码使用exports命令输出一个area方法,用于计算圆的面积。
5. 使用async流程库的方法:
01 async.series[
02 functioncallback {
03 callbacknull, ''hello'';
04 },
05 functioncallback {
06 callbacknull, ''async'';
07 },
08 functioncallback {
09 callbacknull, ''series'';
10 }
11 ],functionerr, results {
12 console.logresults;
13 };
这段代码使用了async流程库的series方法来控制流程,async流程库还有其他几种控制方法,读者可以阅读本书的详细内容。
6. IO异常捕获的方法:
01 try{
02 setTimeoutfunction{
03 var data = a0; TODO: 错误的计算
04 },1000;
05 }catch e{
06 console.loge;
07 }
这段代码演示了使用trycatch语法进行IO异常捕获的方法,第03行代码输出了一个错误的计算,第06行代码输出捕获的错误异常。
7. 初始化Buffer对象的方法:
01 var buffer = new Buffer"This is Buffer", "utf8"; TODO: 初始化Buffer
这段代码演示了初始化Buffer对象的方法,并定义了“utf8”编码格式。
8. 获取进程信息的方法:
01 console.info''当前进程id:'';
02 console.infoprocess.pid;
03 console.info''当前进程名称:'';
04 console.infoprocess.title;
这段代码演示了通过process模块获取进程id和进程名称的方法。
9. 创建子进程的方法:
01 var spawn = require''child_process''.spawn; TODO: 引入child_process模块
02 var ls_var = spawn''ls'', [''-lh'', ''var'']; TODO: 定义命令行‘ls -lh var’
这段代码演示了通过child_process模块创建子进程的方法,并实现了查看var目录的命令。
10. 获取操作系统信息的方法:
01 var type = os.type;
02 console.info''当前操作系统类型为: '' + type;
03 var platform = os.platform;
04 console.info''当前操作系统平台为: '' + platform;
这段代码演示了通过操作系统OS模块获取操作系统类型和平台信息的方法。
11. 读文件的方法:
01 iffs.existsSyncfile_path {
02 var file_contents = fs.readFileSyncfile_path, ''utf-8''; TODO: 读文件(同步方式)
03 console.info''read txtreadFileSync.txt contents: '';
04 console.infofile_contents; TODO: 打印输出文件内容
05 console.info;
06 }
这段代码演示了通过文件系统fs模块读文件的方法。
12. 规范化字符串路径的方法:
01 var path = require''path''; TODO: 引入路径处理模块
02 var path_a = "homeking";
03 console.info''path.normalize"homeking" is : '' + path.normalizepath_a;
这段代码演示了通过路径path模块规范化字符串路径的方法。
13. 创建TCP服务器的方法:
01 var net = require''net''; TODO: 引入网络Net模块
02 var HOST = ''127.0.0.1''; TODO: 定义服务器地址
03 var PORT = 9696; TODO: 定义端口号
04 net.createServerfunctionsock {
05 **
06 * 添加事件处理方法
07 *
08 }.listenPORT, HOST;
这段代码演示了通过网络net模块创建TCP服务器的方法。
14. 创建HTTP服务器的方法:
01 var http = require''http''; TODO: 引入http模块
02 http.createServerfunctionreq, res {
03 **
04 * 通过res.writeHeader函数方法写HTTP文件头
05 *
06 res.writeHead200, {''Content-type'' : ''texthtml''};
07 **
08 * 通过res.write函数方法写页面内容
09 *
10 res.write''Node.js --- HTTP'';
11 **
12 * 通过res.end函数方法发送响应状态码,并通知服务器消息完成
13 *
14 res.end''Create Basic HTTP Server!
'';
15 }.listen6868; TODO: 监听6868端口号
这段代码演示了通过HTTP模块创建Web服务器的方法。
15. Node.js框架连接MySQL数据库的方法:
01 var http = require"http"; TODO: 引入HTTP模块
02 var mysql = require''usrlocallibnode_modulesmysql''; TODO: 引入mysql模块
03 var connection = mysql.createConnection{
04 host: "localhost", TODO: 主机地址
05 user: "root", TODO: 数据库用户名
06 password: "root", TODO: 数据库密码
07 database: "nodejs", TODO: 数据库名称
08 port: 3306 TODO: 端口号
09 };
10 http.createServerfunction req, res {
11 res.writeHead200, { "Content-Type" : "texthtml;charset=utf8" };
12 res.write"测试 Node.js - MySQL 数据库连接!";
13 connection.connectfunctionerr {
14 iferr {
15 res.end''Error Connected to MySQL!
'';
16 return;
17 } else {
18 res.end''Connected to MySQL!
'';
19 }
20 };
21 }.listen6868; TODO: 监听6868端口号
这段代码演示了Node.js框架连接MySQL数据库的方法。
序3 Node.js*流行的面试题
面试题一般不是多么高精尖的问题,在世界500强和中国100强的科技公司中,绝大多数的考题都是基础技术类知识,原因是他们招聘的不是经理,而是具体干活的,所以要考查的就是基本功。面试题不一定有统一的标准答案,读者可以自己测试。
1. 请简要描述一下Node.js框架的概念。
【参考答案】Node.js是一个基于Chrome JavaScript运行时建立的平台,用于方便地搭建响应速度快、易于扩展的网络应用。Node.js框架使用事件驱动、非阻塞IO模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。Node实际上是一个JavaScript运行环境,对Google V8引擎进行了封装,因为V8引擎执行JavaScript的速度非常快,性能非常好。
2. 请简要说明几个Node.js框架的优点。
【参考答案】
RESTful API:支持Web服务和动态Web应用程序的多层架构,实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。开发人员可以轻松使用Ajax和RESTful Web服务一起创建丰富的界面。
单线程:Node.js单线程是指Node并没有创建一个线程的能力,所有代码都是单线程执行的。不过Node宿主环境并不是单线程的,它会维护一个执行队列,循环检测并调度JavaScript线程来执行,因此单线程执行和并发操作并不冲突。
事件轮询机制:Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理,它是通过事件轮询(event loop)来实现并行操作的。
非阻塞IO:由于Node.js是事件驱动的,因此其使用了事件循环来解决IO操作带来的瓶颈问题。在Node.js中,一个IO操作通常会带有一个回调函数,当IO操作完成并返回时,就会调用这个回调函数,而主线程则继续执行接下来的代码。
V8虚拟机:Node.js是一个基于Google Chrome V8 JavaScript引擎之上的平台,可用以创建轻量级、快速、可扩展、事件驱动和非阻塞IO的应用。
事件驱动:Node.js框架使用事件驱动模型,即当Web Server接收到请求时,就将其关闭然后进行处理,然后去服务下一个Web请求。当这个请求完成后,它被放回处理队列中,当到达队列开头时,这个结果被返回给客户端。
3. 简述Node.js框架适用的应用场景。
【参考答案】
(1)面向服务的架构
面向服务的架构就是做好前、后端的依赖分离,将所有的关键业务逻辑都封装成REST调用,上层只需要考虑如何用这些REST接口来构建具体的应用。这样,后台程序员们不需要知道具体数据是如何从一个页面传递到另一个页面的,也不需要知道用户数据更新是通过Ajax异步获取的还是通过刷新页面获取的。Node.js正适合这样的开发场景。
(2)RESTful API
前面,我们讲到了RESTful API是Node.js框架的主要优点,因此也是其*理想的应用场景。应用RESTful API场景可以处理数万条连接请求,该操作没有太复杂的逻辑,仅仅就是请求API,将数据进行返回即可。简而言之,其本质就是从数据库中查找一些值并将其组成一个响应,由于这类响应是很小的文本,同时连接请求也是很小的文本,因此整体流量不高,一台服务器往往也可以处理很繁忙的连接请求。
(3)Ajax请求应用
目前,个性化Web应用十分流行,大数据时代针对个人用户页面的定制信息已经成为主流,当缓存失效后需要在页面加载时发起Ajax请求,此时应用Node.js框架可以响应大量的并发请求。因此Node.js框架适合运用在高并发、IO密集、少量业务逻辑情况下的Ajax请求应用场景。
4. 简述Node.js框架不适用的应用场景。
【参考答案】
当然,Node.js框架也不是**皆适的,有些应用场景也不是它的强项。下面可以列举几种供读者参考。
(1)实时性要求很高的场景,例如工程交换机、工控机器人和DCS集控系统等。这些场景基本通过垃圾回收机制来管理系统内存,因此Node.js框架将会影响响应速度,并且很难进行优化。
(2)计算密集型系统,这些应用基本都是C语言的天下,基于JavaScript语言的Node.js框架在计算性能上是很难与C语言代码相比的。
(3)需要单一进程控制大内存的场景,由于Google V8引擎的设计限制,在32-bit下有1GB **内存尺寸的限制,在64-bit下是1.7GB。虽然Node.js框架的Buffer分配可以不超过此限制,但是也会带来垃圾回收机制上性能的退化。
5. 谈谈Node异步机制的种类。
【参考答案】异步机制方法大致包括回调函数、pubsub模式(事件模式)、异步库控制库(async、when等)、promise项目、Generator项目等。
6. 简述exports与module.exports的区别。
【参考答案】需要明确的是,module.exports才是真正的接口,而exports只不过是module.exports的一个辅助工具,exports是基于module.exports而实现的。实际上,全部由exports获取的属性和方法,*后都赋给了module.exports接口,不过有个前提就是module.exports本身不具备任何属性和方法。换言之,如果module.exports接口已经具备一些属性和方法,那么exports获取的属性和方法将被忽略。
|
|