描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302479772丛书名: Web开发经典丛书
和众多老牌的Node框架相比,hapi是后起之秀,然而它成功地构建了自己的生态圈。PayPal、Yahoo!、Mozilla 和 Disney等公司都使用hapi构建了自己的Web应用,其影响力可见一斑。模块化、以配置为中心和插件化是hapi*的亮点。它的核心仅由少数几个模块构成,其他功能均通过插件扩展来实现,在丰富的功能和无限制的可定制性之间取得了完美平衡。更令人兴奋的是,hapi经历了沃尔玛在黑色星期五期间*大规模的Node部署,可以说已经在生产环境中经历了千锤百炼。本书是一本介绍hapi的入门书籍,由浅入深地全面介绍hapi的设计思想与核心功能,并呈现丰富的案例。希望你能从中受益,并享受使用hapi带来的快乐,这也是框架名称的由来。书主要特色·Node应用设计的较佳实践·维护Hapi构建API·维护和扩展应用·使用插件扩展Hapi在学习本书之前,读者应熟练掌握JavaScript技能。具有Node.js经验有助于学习本书,但不是必需的。
是开发效率,hapi简明的设置允许快速构建和运行应用;二
是可维护性,hapi的模块化设计方便了扩展和改进;三是灵
活性,可用插件来扩展和自定义hapi的轻量级内核。
《hapi.js实战 一书紧贴实用,指导你使用Node.js和hapi.js
框架来构建API、服务器和应用。开篇呈现一个通俗易懂的
Node.js Web应用模型,从中可清晰了解hapi所扮演的角色。
此后讲解构建API并将其集成到Web应用的完整过程,将穿插
介绍验证、测试、身份验证和部署等重要主题。*后讨论如
何构建性能卓越、安全可靠的应用。
主要特色
◆ Node应用设计的*实践
◆ 使用hapi构建API
◆ 维护和扩展应用
◆ 使用插件扩展hapi
在学习本书前,读者应熟练掌握JavaScript技能。具有
Node.js经验有助于学习本书,但不是必需的。
第I部分
入门
第1章 hapi简介 3
1.1 hapi是什么 4
1.1.1 hapi的特色 6
1.1.2 hapi是哪类框架 8
1.2 hapi的组成部分 11
1.2.1 服务器 13
1.2.2 连接 13
1.2.3 路由 13
1.2.4 handler 13
1.2.5 插件 13
1.3 何时应该(不该)使用hapi 14
1.3.1 何时应该使用hapi 14
1.3.2 何时不应该使用hapi 15
1.4 hapi的运作方式 15
1.4.1 安装hapi 15
1.4.2 创建服务器 16
1.4.3 添加路由 16
1.4.4 注册插件 17
1.4.5 运行hapi 18
1.5 获得帮助 18
1.5.1 hapi.js网站 19
1.5.2 Make Me hapi 19
1.5.3 GitHub 19
1.5.4 IRC 19
1.5.5 Stack Overflow 20
目
录
1.5.6 阅读代码 20
1.6 小结 20
第2章
构建API 21
2.1 设计API 21
2.1.1 你应该接受这个任务 21
2.1.2 收集需求 22
2.1.3 设计API接口 22
2.2 准备工作 23
2.2.1 工作目录 23
2.2.2 准备数据库和样本数据 23
2.2.3 sqlite3 node模块 24
2.3 获取和搜索食谱 25
2.3.1 server.route()介绍 25
2.3.2 路由handler 26
2.3.3 接口A:获取所有食谱 28
2.3.4 接口A:搜索食谱 30
2.3.5 接口B:获取单一食谱 31
2.4 编写可维护的代码 32
2.4.1 模块化路由 32
2.4.2 用好server.bind():设置
handler中的上下文 33
2.4.3 模块化handler 35
2.5 身份验证 37
2.5.1 模式和策略 37
2.5.2 实现不记名token身份验证 38
2.5.3 使用用户凭据 40
XVI hapi.js 实战
2.6 食谱创建和标星 40
2.6.1 测试接口 40
2.6.2 接口C:创建食谱 41
2.7 小结 44
第3 章
构建网站 45
3.1 DinDin 网站 45
3.1.1 网站的样子 45
3.1.2 网站是如何运作的 47
3.1.3 设置 47
3.2 网页和静态内容服务 49
3.2.1 静态文件服务 49
3.2.2 整个目录服务 51
3.2.3 server.views():使用Handlebars
动态渲染视图 53
3.2.4 DRY 视图:布局和片段 57
3.3 使用外部API 60
3.3.1 使用Wreck:调用API60
3.3.2 动态主页 62
3.3.3 食谱详情页 62
3.3.4 视图helper 65
3.4 管理登录和用户会话 67
3.4.1 hapi-auth-cookie 插件 67
3.4.2 表单 69
3.4.3 实现登录 71
3.4.4 创建食谱 75
3.4.5 实现注销 78
3.5 小结 79
第II 部分
扩展工具箱
第4 章
深入理解路由和handler 83
4.1 深入理解路由 83
4.1.1 hapi 的路由:路由的排序和
冲突处理 83
4.1.2 路由方法 84
4.1.3 参数化路径 85
4.1.4 hapi 如何选取路由 88
4.2 构建自定义handler 90
4.2.1 国际化例子 91
4.2.2 解析Accept-Language
header 92
4.2.3 个实现 93
4.2.4 再次简化 94
4.3 服务器方法 96
4.4 路由先决条件 99
4.4.1 异步JavaScript 的并发问题 99
4.4.2 指定路由先决条件 101
4.4.3 使用带有先决条件的服务器
方法 102
4.4.4 多重串行先决条件 103
4.4.5 并发先决条件:并行地运行
任务 105
4.5 管理文件上传 107
4.5.1 使用数据输出:把文件内容
读入内存 108
4.5.2 使用流输出:以流的方式获取
文件 109
4.5.3 使用文件输出:把文件存储到
磁盘 110
4.5.4 额外的payload 设置 111
4.4 小结 111
第5 章
理解请求和响应 113
5.1 request 对象和生命周期 113
5.1.1 什么是request 对象 113
5.1.2 请求的生命周期 115
5.1.3 扩展点 118
5.1.4 应该使用哪个扩展点? 121
5.2 reply 接口和response 对象 121
5.2.1 什么是reply 接口? 121
5.2.2 reply() 的有效参数 123
XVII
目
录
5.2.3 response对象 124
5.2.4 使用流来响应 126
5.3 处理错误 128
5.3.1 程序员错误和操作错误 129
5.3.2 HTTP状态码 129
5.3.3 介绍Boom:创建HTTP
友好的错误 131
5.3.4 网站友好的HTML错误
页面 132
5.4 小结 136
第6章
使用Joi验证 139
6.1 介绍Joi140
6.1.1 Joi的工作方式 140
6.1.2 一个简单例子:验证标量
类型 141
6.1.3 一个更复杂的例子:验证一个
复合类型 142
6.2 掌握Joi144
6.2.1 了解API 145
6.2.2 Joi.assert()和Joi.validate()
146
6.2.3 Joi中的类型转换 146
6.2.4 abortEarly选项 147
6.2.5 探索Joi错误 148
6.3 hapi中的验证 150
6.3.1 使用Joi进行输入验证 150
6.3.2 验证payload 152
6.3.3 验证响应 155
6.3.4 使用failAction自定义验证
响应 156
6.4 整合:使用hapi和Joi进行Web
表单验证 157
6.4.1 如何工作 158
6.4.2 创建骨架 159
6.4.3 创建路由和视图 160
6.4.4 添加验证 163
6.4.5 在表单中渲染错误 165
6.4.6 表单提交成功后的重定向 167
6.5 小结 168
第7章
使用插件构建模块化应用 169
7.1 插件思想 169
7.1.1 插件的定义 171
7.1.2 插件的作用 172
7.1.3 把所有东西放进插件 174
7.1.4 Pingoo应用 174
7.2 创建和加载插件 176
7.2.1 创建插件 176
7.2.2 使用server.register()加载
插件 179
7.2.3 插件依赖 180
7.2.4 使用选项配置插件 182
7.3 使用Glue组合插件 186
7.3.1 什么是Glue? 186
7.3.2 创建一个清单 187
7.3.3 使用Confidence工具实现智
能配置 190
7.4 插件通信 193
7.4.1 全局的服务器配置 193
7.4.2 通过server.expose()在插件中
对外公开属性 195
7.4.3 使用事件系统 196
7.5 小结 200
第8章
充分利用缓存 201
8.1 客户端缓存 202
8.1.1 手动设置header 203
8.1.2 在配置中设置缓存策略 203
8.1.3 重新验证和ETag 204
8.2 介绍Catbox:一个多策略的对象
缓存库 207
8.2.1 什么是Catbox 208
XVIII hapi.js 实战
8.2.2 Catbox 客户端和策略 211
8.2.3 Staleness 213
8.2.4 应该用哪个缓存策略? 215
8.3 hapi 应用中的服务器端缓存 216
8.3.1 配置客户端 216
8.3.2 使用server.cache() 创建并使用
Catbox 策略 217
8.3.3 缓存服务器方法 219
8.3.4 使用键、分区和段来组织缓存
数据 220
8.4 小结 222
第Ⅲ部分
创建健壮的应用
第9 章
身份验证和安全 225
9.1 关于身份验证的深度探讨 225
9.1.1 hapi 身份验证概述 226
9.1.2 应该选择哪种身份验证
模式 228
9.1.3 身份验证的scope 228
9.1.4 身份验证模式 229
9.2 通过Bell 实现第三方身份
验证 231
9.2.1 什么是第三方身份验证 231
9.2.2 Bell 简介 232
9.2.3 将Bell 整合进hapi 应用 233
9.3 通过CORS 管理跨域请求 240
9.3.1 允许来自任何地方的跨域
请求 241
9.3.2 只接受指定源的访问 243
9.3.3 处理自定义的header 244
9.3.4 CORS 和凭据(Cookie) 246
9.3.5 CORS 设置的粒度 247
9.4 使用Crumb 保护应用免受CSRF
攻击 248
9.4.1 通过CSRF 令牌对抗CSRF
攻击 249
9.4.2 通过创建自己的漏洞来理解
CSRF
250
9.4.3 通过Crumb 保护HTML 253
9.4.4 使用Crumb 保护restful
API
254
9.5 安全相关的header255
9.6 小结 257
第10 章
使用Lab、Code 和server.inject()
进行测试 259
10.1 Lab 简介 259
10.1.1 个测试 260
10.1.2 Lab 作为本地依赖 261
10.1.3 通过experiments 组织
测试 262
10.1.4 默认异步执行 263
10.1.5 Lab 的语法糖 264
10.2 用Code 断言库制作断言 265
10.2.1 什么是Code 断言库 265
10.2.2 Code 的语法:断言语句的
结构 267
10.3 使用server.inject() 测试hapi
服务 269
10.3.1 为测试准备server 270
10.3.2 server.inject() 的响应
参数 272
10.3.3 使用request payload 进行
测试 272
10.3.4 测试需要验证的路由 274
10.4 Lab 进阶 276
10.4.1 reporter 276
10.4.2 代码覆盖率 278
10.4.3 linting 278
10.4.4 全局变量泄露 279
目
录 XIX
10.4.5 并行执行测试 279
10.5 使用stub、spies和monkey-patching
测试难以测试的代码 281
10.5.1 monkey-patching介绍 281
10.5.2 使用Sinon的Spy和stub 284
10.5.3 使用proxyquire 286
10.6 小结 288
第11章
投入生产环境及更多相关
内容 291
11.1 hapi的日志记录和Good 291
11.1.1 hapi中的服务器事件 291
11.1.2 通过request.log()和
server.log()记录日志 293
11.1.3 通过Good记录线上日志和
处理监控 296
11.1.4 使用多种reporter实例 297
11.2 为路由生成文档 298
11.2.1 路由的tags、notes和
descriptions 299
11.2.2 通过Lout自动生成的
文档 299
11.3 监控 302
11.3.1 Graphite和StatsD 302
11.3.2 通过StatsD度量任何指标 303
11.3.3 使用Oppsy获取hapi的操作
数据 304
11.4 调试 307
11.4.1 不要认为使用console.log()
不好 307
11.4.2 Node debug 307
11.4.3 Node Inspector 309
11.4.4 通过Poop进行Core
dumps 310
11.4.5 使用hapi TV调试实时
请求 312
11.5 部署支持SSL/TLS的应用 314
11.5.1 TLS的配置项 314
11.5.2 在hapi中配置TLS连接 315
11.5.3 使用self-signed凭据测试
SSL 315
11.5.4 强制HTTPS 317
11.6 小结 319
附录A Node.js和npm入门 321
附录B 本书用到的npm包 327
X hapi.js 实战
●
第6 章“使用Joi 验证”教你如何使用具有表现力的强大Joi 库来锁定API,对抗
恶意的数据输入。
●
第7 章“使用插件构建模块化应用”展示如何扩展hapi 以及如何把应用拆分成小
的可维护的插件包。
●
第8 章“充分利用缓存”教你如何利用浏览器和服务器端的缓存来增加应用负载。
第III 部分“创建健壮的应用”讲述如何确保你的应用是安全的、经过严格测试的、
远离bug 的。
●
第9 章“身份验证和安全”研究了验证用户身份的多种方式和一些通用的安全漏
洞防范技术。
●
第10 章“使用Lab、Code 和server.inject() 进行测试”教你书写简单强大的测试
去探查应用的每个角落。
●
第11 章“投入生产环境及更多相关内容”帮助将你的应用投入生产环境,并提供
一些出错时的建议和技术。
有两个附录。附录A 提供了补充信息,包括下载安装Node 和npm。附录B 介绍了版
本号,包含了对本书用到的包的说明。
关于代码
本书包含了很多源代码示例,有带编号的代码清单,也有行内的普通文本。在两种例
子中,源代码用等宽字体格式化以区别于普通文字。有时代码为粗体,用来高亮显示特别
重要或与周边讨论有关的代码。
多数情况下,源代码被重新格式化了;我们加入了折行和修正的缩进以适应书中可用
的页面空间。在极少数情况下,这样还不够,代码清单包含了续行符
。此外,当代码以
文本描述时,源代码中的注释通常会从代码清单中移除。
所有例子的源代码和本书中的代码清单都可以在GitHub(https://github.com/mtharrison/
hapi.js-in-action) 上找到。代码被层次化地组织起来,以匹配书中的章节标题。这样设计是
为了在你学习任何章节时都能方便地查找代码。
另外,可以访问www.tupwk.com.cn/downpage,输入本书的书名或中文ISBN 下载
代码;也可直接扫描封底的二维码下载。
本书和GitHub 上的代码样例仅工作在Node.js 4.0.0 以上版本,因为用到了一些
ES2015 的属性,比如let、const 和箭头函数。
XI
前
言
作者在线
购买《hapi.js实战》时,能够免费访问由Manning出版社运营的私有论坛,在这里你可以对本书进行评论,提出技术问题,并获得作者和其他用户的帮助。要访问和订阅这个论坛,请去https://www.manning.com/books/hapi-js-in-action。这个页面提供了注册后如何进入论坛的信息,指出什么样的帮助有用,介绍论坛的行为规范。
Manning出版社对读者的承诺是提供一个地点,在这里各位读者之间,读者与作者之间可以碰撞出思想的火花。我们不承诺作者现身的次数,他们对该书论坛的贡献是自愿的(并且是无酬劳的)。我们建议你尽量问他一些具有挑战性的问题,激发他的兴趣。
只要本书还在销售中,作者在线论坛和前面讨论的存档就会在出版社的网站上开放。
其他在线资源
●
如果发现任何关于hapi使用方法或整体项目的问题,可在讨论区仓库https://github.com/hapijs/discuss提交issues。
●
在Stack Overflow上也有hapi.js的标签(http://stackoverflow.com/questions/tagged/hapijs)。
作者简介
Matt Harrison 是一位自由职业的Web开发者和顾问。他是hapi.js的核心贡献者,高产的博客作者,也是一位活跃的Node.js社区成员。此前,他曾是一名建筑师。他喜欢吃拉面,喝吉尼斯黑啤
评论
还没有评论。