Node.js权威指南

Node.js权威指南

作者:陆凌牛

出版社:机械工业

出版年:2014年4月

ISBN:9787111460787

所属分类:网络科技

书刊介绍

《Node.js权威指南》内容简介

本书旨在成为Node.js领域最全面、最系统和最具实战性的一本书,供初学者系统学习和开发者工作时参考。本书作者是资深Web开发专家,不仅全面、细致地讲解了Node.js的所有功能、特性、使用方法和开发技巧,而且还介绍了与之相关的各种扩展功能和工具的使用。此外,它实战性强,不仅每个知识点都配有精心设计的小案例(具体的实现步骤、完整的实现代码、最终的实现效果,图文并茂),而且还有两个综合性的案例,能让读者迅速获得实战经验。本书所有实例代码都经调试运行成功,读者可以对这些代码进行修改,以便观察各种不同的效果,加深对实例代码的理解。
本书共16章,分三个部分:第一部分(第1~12章)从Node.js的特性、优势、适用场景、安装配置到各个模块的功能作用,再到开发的具体方法和技巧,非常详尽地讲解了Node.js开发者必备的各种基础知识;第二部分(第13~15章)介绍了在使用Node.js进行开发时极有可能用到的第三方开发包,探讨了如何在Node.js应用程序中使用关系型数据库及NoSQL型数据库,如何使用Express框架开发Web应用程序,以及如何使用Socket.IO类库实现WebSocket通信等;第三部分(第16章)讲解了两个综合案例,如何结合使用Node.js与Socket.IO类库制作一个聊天室应用程序的服务器端及客户端,以及如何结合使用Node.js与Express框架制作一个Web应用程序的服务器端及客户端。
陆凌牛:资深Web开发工程师、软件开发工程师和系统设计师。从事Web开发多年,对各种常见的Web开发技术(包括前端和后端)都有非常深入的研究,经验极其丰富。JavaScript、HTML 5和CSS 3等新技术的先驱者和布道者,对这3种技术以及这3种技术下的主流框架都有非常深刻的认识,并且付诸了大量实践。同时,他还擅长微软与Java的相关技术,在C#、VB.NET、ASP.NET、SQL Server、Oracle、Java、Struts、Spring、Hibernate等方面也积累了大量实战经验。此外,他还是一位颇有影响力的技术作家,著有多本著作。

作品目录

前言
第1章:Node.js介绍
1.1、Node.js概述
1.2、安装Node.js
1.3、Node.js中的模块
1.4、一个简单的示例应用程序
1.5、小结
第2章:Node.js中的交互式运行环境——REPL
2.1、REPL运行环境概述
2.2、在REPL运行环境中操作变量
2.3、在REPL运行环境中使用下划线字符
2.4、在REPL运行环境中直接运行函数
2.5、在REPL运行环境中定义并启动服务器
2.6、REPL运行环境中的上下文对象
2.7、REPL运行环境中的基础命令
2.8、小结
第3章:Node.js基础知识
3.1、Node.js中的控制台
3.2、Node.js中的全局作用域及全局函数
3.3、__filename变量与__dirname变量
3.4、事件处理机制及事件环机制
3.5、在Node.js中使用调试器
3.6、小结
第4章:模块与npm包管理工具
4.1、核心模块与文件模块
4.2、从模块外部访问模块内的成员
4.3、组织与管理模块
4.4、模块对象的属性
4.5、包与npm包管理工具
4.6、小结
第5章:使用Buffer类处理二进制数据
5.1、创建Buffer对象
5.2、字符串的长度与缓存区的长度
5.3、Buffer对象与字符串对象之间的相互转换
5.4、Buffer对象与数值对象之间的相互转换
5.5、Buffer对象与JSON对象之间的相互转换
5.6、复制缓存数据
5.7、Buffer类的类方法
5.8、小结
第6章:在Node.js中操作文件系统
6.1、同步方法与异步方法
6.2、对文件执行读写操作
6.3、创建与读取目录
6.4、查看与修改文件或目录的信息
6.5、可以对文件或目录执行的其他操作
6.6、使用文件流
6.7、对路径进行操作
6.8、小结
第7章:实现基于TCP与UDP的数据通信
7.1、使用net模块实现基于TCP的数据通信
7.2、使用dgram模块实现基于UDP的数据通信
7.3、小结
第8章:创建HTTP与HTTPS服务器及客户端
8.1、HTTP服务器
8.2、HTTP客户端
8.3、创建HTTPS服务器与客户端
8.4、小结
第9章:进程与子进程
9.1、Node.js中的进程
9.2、创建多进程应用程序
9.3、在多个子进程中运行Node.js应用程序
9.4、小结
第10章:Node.js中的错误处理与断言处理
10.1、使用domain模块处理错误
10.2、Node.js中的断言处理
10.3、小结
第11章:加密与压缩
11.1、加密与解密处理
11.2、压缩与解压缩处理
11.3、小结
第12章:Node.js中的其他模块
12.1、使用dns模块解析域名
12.2、使用punycode模块转换punycode编码
12.3、使用os模块获取操作系统信息
12.4、使用readline模块逐行读取流数据
12.5、使用util模块中提供的一些实用方法
12.6、使用vm模块改变脚本运行环境
12.7、自定义REPL运行环境
12.8、小结
第13章:数据库访问
13.1、在MongoDB数据库中存取数据
13.2、在MySQL数据库中存取数据
13.3、小结
第14章:使用Express构建Web应用程序
14.1、Express概述
14.2、设置路由
14.3、使用各种提交数据或请求数据的方法
14.4、中间件
14.5、模板引擎
14.6、小结
第15章:使用Socket.IO类库实现WebSocket通信
15.1、Socket.IO概述
15.2、Socket.IO的使用方法
15.3、在Express框架中使用Socket.IO
15.4、在服务器端保存用户数据
15.5、广播消息
15.6、使用命名空间
15.7、小结
第16章:综合案例介绍
16.1、创建简单聊天室应用程序
16.2、创建Web应用程序
16.3、小结

热门书摘

Files\nodejs,执行文件为node.exe;在Mac操作系统中的默认安装路径为/usr/local/bin,执行文件为node。

在Linux操作系统中,需要对源代码进行编译。在安装了GCC之类的编译环境后,可以通过如下所示的步骤来安装Node.js。

最后一行中的“make install”需要通过使用“root”用户来运行,默认安装路径为/usr/local/bin,执行文件为node。

接下来,我们将要介绍如何制作一个最简单的Node.js应用程序,在介绍该应用程序之前,首先概要介绍一下什么是Node.js中的模块。

Node.js修改了客户端到服务器端的连接方法,解决了这个问题。因为它并不为每个客户端连接创建一个新的线程,而是为每个客户端连接触发一个在

Node.js内部进行处理的事件。因此,如果使用Node.js,可以同时处理多达几万个用户的客户端连接。因此,当需要使Web应用程序能够支持大量用户的并发连接的时候,我们应该考虑使用Node.js。

严格地说,Node.js是一个用于开发各种Web服务器的开发工具。在Node.js服务器中,运行的是高性能V8JavaScript脚本语言,该语言是一种可以运行在服务器端的JavaScript脚本语言。

那么,什么是V8JavaScript脚本语言呢?该语言是一种被V8JavaScript引擎所解析并执行的脚本语言。V8JavaScript引擎是由Google公司使用C++语

言开发的一种高性能JavaScript引擎,该引擎并不局限于在浏览器中运行。Node.js将其转用在了服务器中,并且为其提供了许多附加的具有各种不同用

途的API。例如,在一个服务器中,经常需要处理各种二进制数据。在JavaScript脚本语言中,只具有非常有限的对二进制数据的处理能力,而Node.js所提供的Buffer类则提供了丰富的对二进制数据的处理能力。

另外,在V8JavaScript引擎内部使用一种全新的编译技术。这意味着开发者编写的高端的JavaScript脚本代码与开发者编写的低端的C语言具有非常相近的执行效率,这也是Node.js服务器可以提供的一个重要特性。

据库的代码之后将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中执行,从而提高了程序的执行效率。

中途可以转而处理其他事件(包括触发新的事件、声明该事件的回调函数等),然后返回继续执行原事件回调函数,这种处理机制称为事件环机制。

JavaScript脚本语言的一个特征是它只支持单线程。V8JavaScript脚本语言也是如此,因此不需要担心它会造成死锁现象。但是与客户端脚本语言不同

的是,Node.js中为V8JavaScript脚本语言提供了非阻塞型I/O机制。例如,当在访问数据库取得搜索结果的时候,在开始访问数据库之后、数据库返回结果

之前,存在一段等待时间。在传统的单线程处理机制中,在执行了访问数据库的代码之后,整个线程都将暂停下来,等待数据库返回查询结果之后才能继续

执行其后面的代码。也就是说,I/O操作阻塞了代码的执行,极大地降低了程序的执行效率。由于Node.js中采用了非阻塞型I/O机制,因此在执行了访问数

另外,在Node.js中,虽然不具有因为用户鼠标单击按钮或输入文字等操作而触发的事件,但是具有由于客户端请求建立连接、通过此连接而接收客户

端提交数据、停止客户端提交数据的接收等行为而触发的事件。在Node.js中,在一个时刻只能执行一个事件回调函数,但是在执行一个事件回调函数的

到目前为止,我们对Node.js进行了相关的概要介绍,那么,Node.js适合用来开发何种应用程序呢?回答是:当应用程序需要处理大量并发的输入/输

出,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,我们应该考虑使用Node.js来进行该应用程序的开发。例如,我们可以开发如下应用程序:

聊天服务器:在一个具有很高人气的聊天应用程序中,在同一时刻通常可能存在着大量用户与聊天服务器之间的并发连接,而服务器端本身并不存在非常复杂的处理。

综合服务类网站或电子商务网站的服务器:在这类网站的服务器端,往往可能在每秒钟内接收到多达上千条数据并且需要将这些数据书写到数据库

中,Node.js是解决这类问题的关键。Node.js将通过其队列机制将这些数据迅速书写在缓存区中,然后再通过每一个单独的处理从缓存区中取出这些数据并

将其书写到数据库中。如果使用其他服务器(如Apache服务器或Tomcat服务器)的话,由于这些服务器采用的均为阻塞型I/O机制,因此需要为每条数据

(到数据库中)的写入等待一段时间。如果使用Node.js服务器,由于其采用的是非阻塞型I/O机制,因此可以同时实现这些数据到数据库中的写入,而不必再为每条数据的写入等待一段时间。

Node.js官网(网址为http://nodejs.org/)上提供了Windows与Mac版本的安装程序,以及Linux版本的源代码。执行安装程序即可将Node.js安装在我们的计算机中,在Windows操作系统中的默认安装路径为C:\Program

我们知道,在客户端可以将所有JavaScript代码分割为几个JS文件,然后在浏览器中将这些JS文件合并运行。但是在Node.js中是通过以模块为单位来

划分所有功能的。每一个模块为一个JS文件。每一个模块中定义的全局变量或函数的作用范围也被限定在这个模块之内,只有使用exports对象才能将其传递到外部。代码如下所示:

在上面这行代码中,我们定义了一个printFoo函数,函数内部返回“foo”字符串。同时,我们通过使用exports对象使模块外部可以访问这个printFoo函数。

在回调函数中,使用两个参数,其中第一个参数代表客户端请求对象,第二个参数代表服务器端所做出的响应对象。

在Node.js中,提供了一些核心模块,其中Node.js v0.10版中的模块及其作用见表1-1。

在Node.js中,可以直接使用require函数并将模块名设置为require函数的参数值的方法来引用这些模块。例如,可以使用如下代码来引用http模块:

不引用任何模块的情况下直接使用这些类、函数与对象。Node.js中追加的类、函数与对象见表1-2。

接下来,让我们来看一个最简单的Node.js示例应用程序,其代码如代码清单1-1所示。

了当服务器接收到客户端请求时所执行的回调函数,在该回调函数中指定当服务器接收到客户端请求时所要执行的处理,代码如下所示:

在引用模块时,我们需要使用require函数。例如,将上面这个具有printFoo函数的模块文件保存为foo.js文件之后,可以通过以下代码来访问模块中的printFoo函数:

在第一行代码中,我们读取foo.js模块并通过foo对象来引用该模块,在第二行代码中,我们通过foo对象来访问模块内的printFoo函数,控制台窗口中将输出“foo”字符串。

在这段代码中,使用require函数来引用http模块,该函数返回http模块对象,将该对象赋值给http变量之后即可以通过http变量来访问http模块中的属性及方法。

在Node.js框架中,除了可以使用V8JavaScript引擎中所支持的、ECMAScript 5中定义的函数与类之外,追加了一些类、函数与对象。可以在

除了可以使用内置模块之外,也可以通过各种第三方模块的安装与使用对Node.js的既有功能进行扩展。例如,通过各种模板引擎的安装及使用,我们

可以创建类似于PHP页面、JSP页面之类的动态页面;通过对MySQL之类的数据库进行访问的模块的安装及使用,我们可以在应用程序中对MySQL等数据库进行数据的存取操作。

接下来,我们使用http模块的createServer方法来创建用于接收HTTP客户端请求并返回响应的HTTP服务器应用程序。在createServer方法中,定义

然后通过响应对象的write方法书写一行HTML代码,在本例中书写一个标签,并且在标签中通过使用meta属性将HTML网页所使用的

字符集定义为UTF-8字符集,目的是为了能够在浏览器中显示中文,代码如下所示:

最后,通过响应对象的end方法输出一行HTML代码并结束响应流,代码如下所示:

命令行窗口中将显示“Server running at http://127.0.0.1:1337/”文字,如图1-1所示。

在任何浏览器地址栏中输入“http://localhost:1337/”地址,浏览器窗口中显示“你好”文字,如图1-2所示。

在我们的示例函数中,首先通过响应对象的writeHead方法书写响应头,同时将响应头中的状态码定义为200,将内容类型定义为text/html,表示返回一段HTML代码,代码如下所示:

境中输入任何JavaScript表达式,当用户按下回车键后,REPL运行环境中将显示该表达式的运行结果。本章将详细介绍该运行环境的基础知识。

相关推荐

微信二维码