Node.js实战.pdf

Node.js实战.pdf
 

书籍描述

内容简介
本书是Node.js领域的权威著作,作者拥有20余年Web开发经验,是Google的高级工程师,也是畅销技术图书作家。它不仅适合初学者系统学习,而且适合有一定基础的读者进阶修炼,因为它不仅系统讲解了Node.js的所有基础知识和核心概念,同时还讲解了Node.js的高级特性和最佳实践。此外,本书还包含大量精心设计的、颇具实践指导意义的案例。
全书共12章,分为四部分: 基础篇(1~3章)具体介绍了Node.js的安装、JavaScript语言在V8引擎和Node.js中的应用,以及Node.js的异步编程;提高篇(4~6章)详细讲解了如何编写Node.js应用和模块,以及如何扩展Web服务器;实战篇(7~9章)则讲解了强大的工具和模块,如Express、NoSQL(MongoDB)和SQL(MySQL)等;进阶篇(10~12章)深入讲解了如何在生产环境中运行应用程序,如何测试代码,以及如何使用Node.js编写命令行实用程序。

编辑推荐
Node.js领域的权威著作,由拥有20余年开发经验的Web技术专家、Google高级工程师兼畅销书作家撰写;
系统讲解Node.js基础知识、核心概念和高级特性,同时包含大量案例和最佳实践,是目前唯一真正适合系统学习和进阶修炼的Node.js实战教程

作者简介
Marc Wandschneider,大规模可伸缩Web应用和移动应用设计与开发领域的技术权威,拥有20余年的Web开发经验。早些年曾在微软工作5年,负责培训和管理Visual Basic、Visual J++和.NET Windows Forms开发团队;后来到SourceLabs担任软件开发工程师和架构师,期间开发了开源Wiki平台——SWiK;现在Google公司担任高级工程师。他还是Adylitica的联合创始人,以资深经理人的身份遍足全球,为软件项目和团队提供咨询服务。此外,他也是畅销书作家,撰写了 《Core Web Application Development with PHP and MySQL》一书,并且开发了两个关于PHP的视频培训教程。
译者简介
姚立,毕业于哈尔滨工业大学, 资深Web前端工程师,曾就职于淘宝和IBM,从事Web前端与云计算相关的工作,现在UnitedStack担任前端工程师。
彭森材,毕业于华中科技大学,支付宝前端工程师,花名特木,一个靠谱的普通青年。快乐工作,认真生活。

目录
目  录
译者序
前 言
第一部分 基础篇
第1章 入门 2
1.1 安装Node.js 2
1.1.1 在Windows上安装 2
1.1.2 在Mac上安装 4
1.1.3 在Linux上安装 6
1.2 “Hello World!” 8
1.2.1 Node Shell 8
1.2.2 编辑并运行JavaScript文件 9
1.3 第一个Web服务器 9
1.4 调试Node.js程序 11
1.5 保持最新及获取帮助 13
1.6 小结 14
第2章 进一步了解JavaScript 15
2.1 数据类型 15
2.1.1 类型基础 15
2.1.2 常量 16
2.1.3 number类型 16
2.1.4 boolean类型 18
2.1.5 string类型 18
2.1.6 object类型 21
2.1.7 array类型 23
2.2 类型比较和转换 26
2.3 函数 27
2.3.1 基本概念 28
2.3.2 函数作用域 30
2.4 语言结构 30
2.5 类、原型和继承 31
2.6 错误和异常 34
2.7 几个重要的Node.js全局对象 34
2.7.1 global对象 34
2.7.2 console对象 35
2.7.3 process对象 35
2.8 小结 35
第3章 异步编程 36
3.1 传统编程方式 36
3.2 Node.js的编程方式 37
3.3 错误处理和异步函数 39
3.4 我是谁——如何维护本体 42
3.5 保持优雅——学会放弃控制权 44
3.6 同步函数调用 46
3.7 小结 46
第二部分 提高篇
第4章 编写简单应用 48
4.1 第一个JSON服务器 48
4.2 Node模式:异步循环 52
4.3 小戏法:处理更多的请求 54
4.4 请求和响应对象的更多细节 59
4.5 提高灵活性:GET参数 61
4.6 修改内容:POST数据 64
4.6.1 接收JSON POST数据 65
4.6.2 接收表单POST数据 68
4.7 小结 69
第5章 模块化 70
5.1 编写简单模块 70
5.2 npm:Node包管理器 72
5.3 使用模块 74
5.3.1 查找模块 74
5.3.2 模块缓存 74
5.3.3 循环 75
5.4 编写模块 75
5.4.1 创建模块 76
5.4.2 使用模块进行开发 81
5.4.3 发布模块 82
5.5 应当内置的通用模块 83
5.5.1 常见问题 83
5.5.2 解决方案 84
5.6 小结 89
第6章 扩展Web服务器 91
6.1 使用Stream处理静态内容 91
6.1.1 读取文件 91
6.1.2 在Web服务器中使用Buffer处理静态文件 93
6.1.3 不仅仅支持HTML 95
6.2 在客户端组装内容:模板 98
6.2.1 HTML骨架页面 99
6.2.2 处理静态内容 100
6.2.3 修改URL解析机制 101
6.2.4 JavaScript加载器 103
6.2.5 使用Mustache模板化 103
6.2.6 首页Mustache模板 105
6.2.7 整合应用 106
6.3 小结 108
第三部分 实战篇
第7章 使用express构建Web应用 110
7.1 安装express 110
7.2 express中的路由和分层 112
7.2.1 路由基础 112
7.2.2 更新相册应用路由 114
7.3 REST API设计和模块 116
7.3.1 API设计 116
7.3.2 模块 117
7.4 中间件功能 119
7.4.1 基本用法 120
7.4.2 配置 120
7.4.3 中间件执行顺序 121
7.4.4 静态文件处理 122
7.4.5 POST数据、cookie和session 124
7.4.6 对PUT和DELETE更友好的浏览器支持 126
7.4.7 压缩输出 126
7.4.8 HTTP基本身份验证 127
7.4.9 错误处理 128
7.5 小结 129
第8章 数据库I:NoSQL(MongoDB) 130
8.1 设置MongoDB 130
8.1.1 安装MongoDB 130
8.1.2 在Node.js中使用MongoDB 131
8.2 MongoDB数据结构 132
8.2.1 全是JavaScript的世界 132
8.2.2 数据类型 132
8.3 理解基本操作 133
8.3.1 连接并创建数据库 133
8.3.2 创建集合 134
8.3.3 向集合中插入文档 135
8.3.4 更新文档内容 135
8.3.5 删除集合中的文档 136
8.3.6 查询集合 136
8.4 更新相册应用 138
8.4.1 编写基本操作 139
8.4.2 修改JSON服务器的API 144
8.4.3 更新处理程序 144
8.4.4 为应用添加新页面 149
8.5 应用结构回顾 153
8.6 小结 153
第9章 数据库II:SQL(MySQL) 154
9.1 准备工作 154
9.1.1 安装MySQL 154
9.1.2 从npm添加mysql模块 155
9.2 创建数据库模式 155
9.3 基本数据库操作 156
9.3.1 连接数据库 156
9.3.2 添加查询 156
9.4 添加应用身份验证 157
9.4.1 更新API以支持用户 157
9.4.2 检测核心用户数据操作 157
9.4.3 更新express应用 161
9.4.4 创建用户处理程序 162
9.4.5 创建登录和注册页面 164
9.5 资源池 167
9.5.1 入门 168
9.5.2 处理连接 168
9.6 验证API 169
9.7 小结 171
第四部分 进阶篇
第10章 部署和开发 174
10.1 部署 174
10.1.1 级别:基础 175
10.1.2 级别:Ninja 176
10.2 多处理器部署:使用代理 178
10.3 虚拟主机 183
10.3.1 内置支持 183
10.3.2 代理服务器支持 185
10.4 使用HTTPS/SSL保障项目安全 186
10.4.1 生成测试证书 186
10.4.2 内置支持 186
10.4.3 代理服务器支持 187
10.5 多平台开发 188
10.5.1 位置和配置文件 188
10.5.2 处理路径差异 189
10.6 小结 190
第11章 命令行编程 191
11.1 运行命令行脚本 191
11.1.1 UNIX和Mac 191
11.1.2 Windows 192
11.1.3 脚本和参数 193
11.2 同步处理文件 194
11.2.1 基本文件API 194
11.2.2 文件和状态 196
11.2.3 目录内容 197
11.3 用户交互:标准输入和输出 197
11.3.1 基本缓冲输入和输出 197
11.3.2 无缓冲输入 198
11.3.3 Readline模块 200
11.4 进程处理 204
11.4.1 简单进程创建 204
11.4.2 使用Spawn创建进程 205
11.5 小结 206
第12章 测试 207
12.1 测试框架选择 207
12.2 编写测试用例 208
12.2.1 简单功能测试 209
12.2.2 异步功能测试 211
12.3 RESTful API测试 212
12.4 小结 214

序言
前  言
欢迎来到Node.js的世界。Node.js是专为编写网络和Web应用而生的全新平台,在过去的几年中,迅速积累了大量的人气并在开发社区拥有一大批拥趸。在本书中,我会介绍更多关于Node.js的知识,告诉你为什么它会如此迷人。我会教你如何快速上手并编写Node.js程序。很快,你会发现Node.js名字的叫法非常灵活,它经常被叫做Node,甚至被称为“node”。本书中我也会经常这么称呼。
为什么使用Node.js
Node.js的兴起有两个主要原因,我会在下面加以解释。
万维网
在过去,编写Web应用是一个相当标准化的流程。你有一个或多个服务器部署在机器上并监听某个端口(如HTTP的80端口),每当服务器接收到一个请求时,它会创建一个进程或者线程去处理和响应请求。处理这些请求会频繁地与外部服务进行通信,比如数据库、内存缓存、外部计算服务器或者仅仅是文件系统。当所有的工作最终结束之后,线程或者进程会返回到“可用”服务器池中,这样服务器就可以处理更多的请求了。
这是一个合理的线性过程,容易理解且极易编码。但是,有两个缺点一直困扰着这种模型:
1. 每一个线程或进程都会消耗一些资源。在一些机器中,对于使用PHP和Apache构建的应用,每个进程甚至会消耗高达10~15MB的内存。特别是在大型服务器不断运行并创建线程来处理请求的时候,每一个线程都会消耗一些资源来创建新的堆栈和执行环境。很快,服务器就会陷入没有内存可用的境地。
2. 在最常见的使用场景下,Web服务器会与数据库、缓存服务器、外部服务器或文件系统通信,这会消耗大量的等待时间,直到这些服务处理完并返回响应。当服务器等待响应的时候,当前线程就会被“阻塞”,无法继续执行下去。因此,消耗的服务器资源和当前服务器进程或线程会被完全冻结,直到返回响应相关资源才会得到释放。
只有当外部组件返回响应之后,进程或线程才会继续完成处理,并把结果返回给客户端,然后重置并等待处理下一个请求。
因此,尽管这种模型非常容易理解和编码,但是一旦脚本花费大量的时间来等待数据库服务器结束查询,这种模型就略显低效——而这却是现代Web应用极其常见的应用场景。
当然,这种问题已经有了很多通用的解决方案。我们可以购买更强大、拥有更多内存的Web服务器;可以使用更小的轻量级服务器如lighttpd或者nginx来替代Apache这样功能强大的HTTP服务器;可以定制或者精简你喜欢的编程语言版本,比如PHP或Python(事实上,Facebook已经先行一步,并且开发出将PHP转换成原生C++代码的系统,以达到最大执行速度和最优代码规模的目的);甚至,可以通过购置更多服务器的方式来提高所能容纳的并发连接数。
前沿技术
多年来,Web开发者一直在为优化服务器资源和提高并发数而努力;而这期间,其他一些有趣的事情已经悄然发生。
JavaScript,这门在Web浏览器中以客户端脚本语言而闻名于世(同时也经常遭人诟病)的古老(1995年左右面世)语言,已经重新焕发生机。诸多现代Web浏览器重构了JavaScript的实现,并添加了许多新的特性,让它变得更加强大和稳定。随着诸多浏览器客户端类库的出现,如jQuery、script.aculo.us、Prototype等,JavaScript编程变得有趣且富有成效。这些类库封装了原先臃肿的API,并添加了很多有趣、动态的效果。
同时,各大浏览器群雄割据的时代业已到来,谷歌的Chrome、Mozilla的Firefox、苹果的Safari和微软的IE浏览器一起争夺浏览器之王的桂冠。作为其中的一部分,这些公司加大了在JavaScript上的研发比重,从而让Web应用可以更可靠地依赖脚本,并且拥有更强大的动态效果。特别是谷歌公司的Chrome浏览器使用的V8 JavaScript引擎,性能尤为卓越,并且是开源软件,可供任何人使用。
天时地利人和,JavaScript的机遇随着开发人员的全新网络(Web)应用开发方式而出现。这,就是Node.js的新生。
Node.js的前世今生
2009年,一位名叫Ryan Dahl的研究员(后来他加入Joyent,该公司是一家坐落于加利福尼亚州的云计算和可视化服务公司)一直在寻求开发一种专为Web应用提供类似于Gmail推送服务的功能,但是一直没有找到一个完全合适的解决方案。最后,他把目光落到了JavaScript上,因为这门语言缺乏健壮的输入/输出(I/O)模型(这也就意味着他可以自己写一个全新的I/O系统),同时还有性能优越的V8引擎可供编程使用。
受Ruby和Python社区中类似项目的启发,他最终选择了Chrome的V8引擎和一个叫做libev的事件处理类库,并且很快推出了第一版的Node.js系统。Node.js的主要理论和创新就是它完全构建在事件驱动、非阻塞的编程模型之上。简而言之,你完全不会(或者极少)编写线程阻塞的代码。
一个Web应用——为了处理请求并返回响应——一般需要执行数据库查询。Web应用处理请求,并会在返回响应之后告诉Node.js如何处理。同时,应用代码也可以开始处理其他传入的请求,实际上,它可以处理任何需要处理的任务,比如清理系统数据或分析数据。
通过这种应用处理请求和工作方式的改变,可以简单地编写能够同时处理几百甚至几千个请求的Web服务器,同时也不用消耗太多的资源。Node是在单进程上运行的,并且Node代码一般也是单线程执行,因此,相较于其他平台而言,Node对资源的需求就小得多。
但是,这种执行速度和能力是有一些瑕疵的。因此,必须充分认识到它们,然后就可以开始小心翼翼地使用Node进行工作了。
首先,这种全新的模型机制不同于以往你所接触过的模型,因此你可能会感到困惑。在充分理解这些核心概念之前,你可能会对这些Node.js代码感到奇怪。本书中的大部分篇幅会讨论编程人员在迎接Node异步、非阻塞编程挑战时所使用的核心模式,并指导你如何开发自己的Node程序。
这种编程模型的另一个限制是:它真的是在为处理大量不同任务的应用程序服务,会同很多不同的进程、服务器或服务通信。当Web应用需要连接到数据库、缓存服务器、文件系统、应用服务器或其他服务时,Node.js便会大放异彩。但是另一方面,实际上它并不是那些需要做长时间精密计算的服务器的最佳运行环境。因此,单进程、单线程的Node模型在处理一个给定的请求时,如果该请求需要花费大量的时间生成一个复杂的密码摘要(password digest)或处理图像,就会带来问题。在那些需要更多的计算密集型工作的情况下,我们必须小心谨慎地处理应用程序使用资源的情况,甚至可以考虑把这些任务移植到其他平台,并把它们作为第三方服务供Node.js程序调用。
最后,Node.js是一个值得信赖的全新平台,并且正在积极发展中。它还没有(截至2013年2月)发布1.0版本,同时Node.js的版本更新非常频繁,甚至到了让人眼花缭乱的地步。
为了减少这些频繁的更新所引起的不确定性和烦恼,开发者已经使用标签来标识系统各个部分的不同稳定级别,从不稳定(Unstable)到稳定(Stable)再到锁定(Locked)。系统中稳定或锁定的部分几乎不会改动;如需改动,社区会通过大量的讨论以确定是否会产生太多问题。在你阅读本书的过程中,我们会指出哪些地方不太稳定,并提供相应的解决方法,从而减少因API改变而带来的危险。
好消息是,Node.js已经有一个庞大而活跃的用户社区和一堆邮件列表、论坛及用户组,它们致力于促进平台的发展并提供力所能及的帮助。通过简单的谷歌搜索,就可以在几秒钟之内回答你99%的问题,所以,请不要害怕Node.js!
本书读者
本书的读者要喜欢编程,并且要熟悉至少一门主流编程语言的功能和语法,比如Java、
C/C++、PHP或者C#等。读完本书之后,你不必成为一名专家,但你一定要高于“Y天精通X语言”的水平。
如果像我一样,你可能已经写过一些HTML/CSS/JavaScript代码,从而和JavaScript“打过交道”。但是你可能并不是非常熟悉JavaScript,只是单纯地从博客或者邮件列表中把代码复制出来。事实上,由于笨重的用户界面和令人沮丧的浏览器不匹配问题,你可能在一开始就对JavaScript没有好感。但是不用害怕——在本书第一部分结束之后,你对这门语言的糟糕印象从此会变成过去时。我希望你能放松心情,面露微笑,轻松愉快地编写你的第一个Node.js程序。
你还需要了解Web应用的基本工作原理:浏览器向远程服务器发送HTTP请求;服务器处理请求并返回表明成功或者失败的标识,返回对象中有可能会附带一些数据(比如渲染页面用的HTML代码或者请求返回的JSON数据)。在过去,你可能会在连接数据库服务器并发送查询请求后,等待返回数据集等。而在使用示例和程序来描述一些全新的概念的时候,我会详细讲解并帮助大家理解这些全新或者生僻的概念。
如何使用本书
本书实质上就是一本新手教程。我会尽量使用代码去解释原理,避免使用冗长的篇幅和晦涩的语言。因为我觉得好的解释说明应该是生动有趣的,如果你感兴趣的话,我还会告诉你一些资源或者一些其他的文档(当然这些并不是必需的)。
本书一共分为四大部分。
第一部分 基础篇——首先,你会学习如何安装并运行Node;然后,会进一步了解JavaScript这门语言以及在V8和Node.js中使用的扩展;最后,会编写你的第一个Node.js应用。
第二部分 提高篇——在本篇中,你会开始学习开发更强大且有趣的应用服务器。同时,我会教你编写Node.js程序时会用到的一些核心概念和最佳实践。
第三部分 实战篇——在本篇中,你会看到一些强大的工具和模块,利用它们,你可以编写自己的Web应用,比如Web服务器的中间件及与数据库服务器的通信。
第四部分 进阶篇——最后,我会以一些高级特性的介绍结束本书,比如如何在生产环境中运行应用,如何测试代码以及如何使用Node.js编写命令行实用程序。
在阅读本书的过程中,最好花些时间打开编辑器,输入这些代码,然后看看这些代码在你当前的Node.js版本下是如何运行的。或者是在看书的时候,编写并开发你自己的小程序。在阅读本书的过程中,你会开发一个小小的相册应用,希望能给你编写其他应用提供一些灵感和想法。
下载源代码
本书示例的源代码可以在github.com/marcwan/LearningNodeJS上找到。希望你能下载代码并运行一遍。如果条件允许,不要放弃亲手把代码敲出来的机会,可以多尝试尝试。
GitHub上托管了功能齐全的示例代码,并且已经使用最新版的Node.js,在Mac、Linux和Windows下测试过。如果最新版的Node需要更新源代码,我会在GitHub上及时更新并做出注释,所以请确保每隔几个月就获取一次最新的代码。
如果你对本书中的示例代码有任何疑问,请在github.com/marcwan/LearningNodeJS上提交issue。我们会看到这些issue,并且会及时做出合理的解答。
致谢
我要感谢PHPTR各位朋友给予的支持和建议,是你们的帮助让本书和其他项目付诸实践。感谢本书文字编辑的杰出贡献。
非常感谢Bill Glover和Idriss Juhoor,是你们出色的技术和样式审校让本书愈加精彩。
最后,感谢至爱Tina,感谢一路有你。

文摘
第一部分
基 础 篇
第1章 入门
第2章 进一步了解JavaScript
第3章 异步编程

第1章
入  门
在本章中,我们会开始投入到相关的学习中,并在电脑上安装Node.js。在继续深入学习语言和编写网络应用之前,要确保Node.js能正常运行。本章的最后,应该已经成功地在电脑上安装Node.js并正常运行。我们还会使用一些小的测试程序来熟悉它,以及学会如何使用内置的Node调试器。
1.1 安装Node.js
首先,让我们来看看如何在Windows下安装Node。除非同时拥有Windows操作系统,否则Mac和Linux用户可以跳过本节,去阅读相应的章节。
1.1.1 在Windows上安装
要想在Windows电脑上安装Node.js,可以使用nodejs.org网站上提供的简易安装程序。可以访问下载页面,然后选择32位或者64位的Node.js安装程序(.msi)。当然,这完全取决于运行Node的操作系统。我们将会展示Windows 7/64位操作系统下Node.js的安装过程。
下载完MSI文件之后,双击该文件,将会看到如图1.1所示的安装程序界面。
阅读并同意授权协议之后,点击安装(Install)。安装过程非常快捷和方便,几十秒之后,点击完成(Finish)结束安装。
验证安装
为了测试Node.js是否正确安装,你可以使用Windows命令提示符cmd.exe(如果使用PowerShell,也是可行的)。如果你对此不熟悉的话,可以先找到开始(Start)/运行(Run),然后输入cmd,如图1.2所示。

图1.1 Windows下的Node安装程序

购买书籍

当当网购书 京东购书 卓越购书

PDF电子书下载地址

相关书籍

搜索更多