Web开发技术丛书:Node.js实战 [平装] 9787111459699

配送至
$ $ USD

本书是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.js2 1.1.1 在Windows上安装2 1.1.2 在Mac上安装4 1.1.3 在Linux上安装6 1.2 “Hello World!”8 1.2.1 Node Shell8 1.2.2 编辑并运行JavaScript文件9 1.3 第一个Web服务器9 1.4 调试Node.js程序11 1.5 保持最新及获取帮助13 1.6 小结14 第2章 进一步了解JavaScript15 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 不仅仅支持HTML95 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 安装express110 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和session124 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 设置MongoDB130 8.1.1 安装MongoDB130 8.1.2 在Node.js中使用MongoDB131 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服务器的API144 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 安装MySQL154 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 验证API169 9.7 小结171 第四部分 进阶篇 第10章 部署和开发174 10.1 部署174 10.1.1 级别:基础175 10.1.2 级别:Ninja176 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和Mac191 11.1.2 Windows192 11.1.3 脚本和参数193 11.2 同步处理文件194 11.2.1 基本文件API194 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,感谢一路有你。
文摘
版权页: 5.3使用模块 正如我们之前看到的,要在编写的Node文件中引入模块,需要使用require函数。为了能够引用模块里的函数和(或)类,需要将结果(被加载的模块的exports对象)赋值给一个变量: var http=require(‘http’); 引入的模块对于引入它们的模块是私有的,所以,如果a.js加载http模块,那么b.js是无法引用这个模块的,除非b.js自己也加载http模块。 5.3.1 查找模块 Node.js使用一组相当简单的规则来查找require函数请求的模块: 1)如果请求的是内置模块——例如http或者fs—Node会直接使用这些模块。 2)如果require函数的模块名以路径符开始(如./、../或者/),那么Node会在指定的目录中查找模块并尝试去加载它。如果没有在模块名中指定js扩展名,Node会首先查找基于同名文件夹的模块。如果没有找到,它会添加扩展名js、.json和.node,并依次尝试加载这些类型的模块(带有.node扩展名的模块会被编译成附加模块)。 3)如果模块名开始时没有路径符,Node会在当前文件夹的node_modules/子文件夹下查找模块。如果找到,则加载该模块;否则,Node会以自己的方式在当前位置的路径树下搜寻node modules/文件夹。如果依然失败,它会在一些默认地址下进行搜寻,例如/usr/lib和/usr/local/lib文件夹。 4)如果在以上任何一个位置都没有找到模块,则抛出错误。
ISBN
出版社机械工业出版社
作者温施耐德 (Marc Wandschneider)
尺寸16