元数据

Node与Express开发

  •  Node与Express开发|200
  • 书名: Node与Express开发
  • 作者: Ethan Brown
  • 简介: 本书涵盖Express 4.0,系统地讲解了利用Express(Node/JavaScript开发栈中的重要组件)开发动态Web应用的流程和步骤。作者Ethan Brown通过开发一个示例应用讲授了开发公共网站和REST API的基础知识。此外还介绍了设计与实现Web架构的最佳实践,帮你用Express构建单页、多页以及混合Web应用。Express在根本没有框架和有一个健壮的框架之间找到了平衡,让你自由选择架构。通过本书,熟悉JavaScript的前端和后端工程师会发现一种新的Web开发视角。
  • 出版时间 2015-01-23 00:00:00
  • ISBN: 9787115380333
  • 分类: 计算机-编程设计
  • 出版社: 人民邮电出版社
  • PC地址:https://weread.qq.com/web/reader/96932510718ff5f9969fda8

高亮划线

1.2 初识Express

📌 “精简的、灵活的Node.js Web程序框架,为构建单页、多页及混合的Web程序提供了一系列健壮的功能特性。” ⏱ 2021-12-15 14:01:48

📌 通常,你的第一项任务就是把不需要的功能砍掉,或者替换掉不能满足需求的功能。Express则采取了截然不同的方式,让你在需要时才去添加东西。 ⏱ 2021-12-17 17:51:41

📌 一般而言,“程序”是具有功能的,它不止是内容的静态集合(尽管这也是非常简单的Web程序)。 ⏱ 2022-03-27 22:00:33

📌 单页Web程序把整个网站(或很大一部分)都下载到客户端浏览器上。经过初始下载后,用户访问不同页面的速度更快了,因为几乎不需要或者只要很少的服务端通信。单 ⏱ 2022-03-27 22:30:29

📌 只是现在有更多选择了,你可以决定哪些内容应该作为单页程序提供,哪些应该通过不同的请求提供。“混合”说的就是同时使用这两种方式的网站。 ⏱ 2022-03-27 22:30:18

1.3 Express简史

📌 Express借鉴一个在Ruby上构建的框架并不奇怪:Ruby致力于让Web开发变得更快、更高效、更可维护,并衍生了大量的Web开发方式 ⏱ 2022-03-27 22:32:19

📌 Connect创造了“中间件”(middleware)这个术语来描述插入式的Node模块,它能在不同程度上处理Web请求。 ⏱ 2022-03-27 22:34:20

1.5 Node:一种新型Web服务器

📌 但要让Node服务器在生产环境中发挥出最优性能,进行调优也绝非易事,只不过是配置选项更简单,也更直接了。 ⏱ 2022-03-27 22:41:43

📌 Node和传统的Web服务器之间的另一个主要区别是:Node是单线程的。乍一看可能觉得这是一种倒退。但事实证明,这是天才之举。单线程极大地简化了Web程序的编写,如果你需要多线程程序的性能,只需启用更多的Node实例,就可以得到多线程的性能优势。 ⏱ 2022-03-27 22:41:54

1.6 Node的生态系统

📌 所有主流关系型数据库(MySQL、MariaDB、PostgreSQL、Oracle、SQLServer)的接口都有, ⏱ 2022-04-08 21:00:42

📌 然而Node开发的出现带动了一种新式的数据库存储方式,这种方式被称为“NoSQL数据库”。用否定的方式来下定义有时并不恰当,所以我们更准确地称之为“文档数据库”或“键/值对数据库”。它们提供了一种概念上更简单的数据存储方式。这种数据库有很多,但MongoDB是其中的佼佼者,也是我们要在本书中使用的数据库。 ⏱ 2022-04-08 21:00:48

📌 另外两个通常来说对Web程序开发必不可少的组件是数据库服务器和模板引擎 ⏱ 2022-04-09 14:39:12

第2章 从Node开始

📌 。掌握Express及其实用性需要对Node有基本的认识 ⏱ 2022-04-10 18:24:27

2.2 使用终端

📌 如果你在安装npm包时指定-g(全局)选项,它们会被装在你的Windows主目录的一个子目录下。我发现如果你的用户名中有空格(我的用户名过去是“Ethan Brown”,现在是“ethan.brown”),很多包都会出现问题。出于安全考虑,我建议你选一个没有空格的Windows用户名。 ⏱ 2022-04-10 18:44:15

2.4 npm

📌 npm是随处可见的Node开发包管理器(我们就是用它获取并安装Express的)。 ⏱ 2022-04-10 18:50:36

📌 从广义上来说,包管理器的两个主要职责是安装开发包和管理依赖项。npm是一个快速、高能并且毫不费力的包管理器,在Node生态系统的高速成长和多样化过程中发挥了重要作用。 ⏱ 2022-04-10 18:50:59

2.5 用Node实现的简单Web服务器

📌 从localhost的名字就能看出来,它指的是你所在的机器。这是IPv4回环地址127.0.0.1或者IPv6回环地址::1的常用别名。 ⏱ 2022-04-10 19:06:54

📌 Node只是给你提供了一个构建Web服务器的框架。 ⏱ 2022-04-10 19:09:52

📌 这个服务器并没有返回HTML,而只是向你的浏览器传递了一条普通的文本消息“Hello world! ”。 ⏱ 2022-04-10 19:56:33

📌 Node的核心理念是事件驱动编程。这对程序员来说,意味着你必须知道有哪些事件,以及如何响应这些事件 ⏱ 2022-04-10 20:06:53

📌 HTTP请求就是要处理的事件。http.createServer方法将函数作为一个参数,每次有HTTP请求发送过来就会调用那个函数。我们这个简单的程序只是把内容类型设为普通文本,并发送字符串“Hello world! ”。 ⏱ 2022-04-10 20:39:05

📌 路由是指向客户端提供它所发出的请求内容的机制。 ⏱ 2022-04-10 20:39:10

📌 接下来我们提供一些真正的HTML和logo图片。因为这些内容不会变化,所以它们都被称为“静态资源” ⏱ 2022-04-12 21:25:25

2.6 走向Express

📌 我们基本上是在重复Apache或IIS可自动完成的工作,但现在你已经了解了Node是如何工作的,也知道你拥有多少控制权 ⏱ 2022-04-12 23:22:33

3.1 脚手架

📌 这个想法很简单:大多数项目都需要一定数量的“套路化”代码,谁会想每次开始新项目时都重新写一次这些代码呢?对此有个简单的方法,那就是创建一个通用的项目骨架,每次开始新项目时,只需复制这个骨架,或者说是模板。 ⏱ 2022-04-12 23:22:52

3.3 初始步骤

📌 运行npm install会把指定名称的包安装到node modules目录下。如果你用了—save选项,它还会更新package.json文件。 ⏱ 2022-04-12 23:34:28

📌 在Express文档中写的是app.VERB。这并不意味着存在一个叫VERB的方法,它是用来指代HTTP动词的(最常见的是“get”和“post”)。这个方法有两个参数:一个路径和一个函数。 ⏱ 2022-04-12 23:47:11

📌 app.VERB帮我们做了很多工作:它默认忽略了大小写或反斜杠,并且在进行匹配时也不考虑查询字符串。所以针对关于页面的路由对于/about、/About、/about/、/about?foo=bar、/about/?foo=bar等路径都适用。 ⏱ 2022-04-12 23:47:40

📌 (Express默认的状态码是200,不用显式指定)。 ⏱ 2022-04-12 23:47:48

📌 Express还提供了一个res.type方法,可以方便地设置响应头Content-Type。尽管仍然可以使用res.writeHead和res.end,但没有必要也不作推荐。 ⏱ 2022-04-12 23:49:33

📌 我们对定制的404和500页面的处理与对普通页面的处理应有所区别:用的不是app.get,而是app.use。app.use是Express添加中间件的一种方法 ⏱ 2022-04-12 23:49:51

📌 路由和中间件的添加顺序至关重要。如果我们把404处理器放在所有路由上面,那首页和关于页面就不能用了,访问这些URL得到的都是404。 ⏱ 2022-04-12 23:50:24

📌 还记得上一章我们是如何规范化req.url来确定所请求的资源吗?我们必须手动剥离查询字符串和反斜杠,并转化为小写。而Express的路由器会自动帮我们处理好这些细节。 ⏱ 2022-04-12 23:50:57

📌 视图与静态资源(比如图片或CSS文件)的区别是它不一定是静态的:HTML可以动态构建,为每个请求提供定制的页面。 ⏱ 2022-04-12 23:51:25

📌 Express比较偏好的视图引擎是Jade(因为它也是TJ Holowaychuk开发的) ⏱ 2022-04-12 23:51:42

📌 我认识的大多数前端开发人员都不喜欢他们主要的标记语言被抽象化处理。因此我推荐使用另外一个抽象程度较低的模板框架Handlebars。Handlebars(基于与语言无关的流行模板语言Mustache)不会试图对HTML进行抽象 ⏱ 2022-04-12 23:53:52

📌 视图引擎默认会返回text/html的内容类型和200的状态码。在catch-all处理器(提供定制的404页面)以及500处理器中,我们必须明确设定状态码。 ⏱ 2022-04-13 00:01:45

📌 Express靠中间件处理静态文件和视图。第10章会更详细地介绍中间件的概念。现在只需了解中间件是一种模块化手段,它使得请求的处理更加容易。 ⏱ 2022-04-13 00:02:54

4.1 最佳实践

📌 最近你应该听了很多次“最佳实践”这个词,它的意思是你应该“正确地做事”,不要走捷径(我们马上就会讨论它的确切含义)。 ⏱ 2022-04-13 18:00:54

📌 你一定听过那句工程格言:面对“快速”“低廉”“优质”三个选项,你总是只能任选其中两个。 ⏱ 2022-04-13 18:00:59

📌 如果你按照坏习惯练习,坏习惯就变成机械式的了。 ⏱ 2022-04-13 18:01:32

📌 所以你应该遵循完美的规则去练习,这样才能成就完美。 ⏱ 2022-04-13 18:01:35

4.2 版本控制

📌 能够回溯项目的历史,回顾所做的决策及组件的开发顺序,可形成宝贵的文档。记录项目的历史是十分有价值的。 ⏱ 2022-04-13 19:50:33

📌 如果你在一个团队中工作,归属极其重要。当你发现代码模糊不清或有问题时,知道是谁做的修改可以节省你很多时间。 ⏱ 2022-04-13 19:50:25

📌 你可以引出一个分支,尝试做一些新的东西,不用担心会影响项目的稳定性。如果试验成功,你可以把它纳入到项目中;如果不成功,你可以放弃它。 ⏱ 2022-04-13 19:50:38

4.4 npm包

📌 如果你想满足自己的好奇心,抑或是为了调试程序,可以随意浏览这个目录,但永远不要修改这个目录中的任何代码。这是因为那不仅是不良的行为,而且你所做的修改很可能轻易地就被npm消除了。 ⏱ 2022-04-13 20:30:47

📌 package.json文件有双重作用:描述项目和列出依赖项。现在去看看你的package.json文件, ⏱ 2022-04-13 20:31:01

📌 现在我们的package.json文件里只有与依赖项相关的信息。注意包版本号之前的插入符(^),这表明在下一个主要版本号之前,所有以指定版本号开始的版本都能用。比如说,这个package.json中的Express,从4.0.0开始都能用,所以4.0.1和4.9.9都可以,但3.4.7不行,5.0.0也不行。 ⏱ 2022-04-13 21:33:12

📌 npm中的版本号是由组件semver(表示“语义版本器”)解析的。如果你想了解npm中更多与版本有关的信息,可以翻阅一下semver的文档(https://www.npmjs.org/doc/misc/semver.html)。 ⏱ 2022-04-13 21:41:56

4.5 项目元数据

📌 package.json文件的另一个作用便是存放项目的元数据,比如项目名称、作者、授权信息等。 ⏱ 2022-04-14 11:08:45

📌 如果你想把项目放到npm或Github上,则对元数据的要求会比较严格。如果你想了解更多有关package.json中各个域的信息,请查阅package.json的文档(https://www.npmjs.org/doc/files/package.json.html)。 ⏱ 2022-04-14 11:08:50

4.6 Node模块

📌 Node模块和npm包是两个相互关联但又彼此不同的概念。Node模块,就像它的名字一样,提供了一个模块化和封装的机制。npm包则提供了一种存储、版本化和引用项目(不限于模块)的标准范式。 ⏱ 2022-04-14 11:23:47

📌 如果你想让一个东西在模块外可见,必须把它加到exports上。在这个例子中,在模块外可以访问到函数getFortune,但数组fortuneCookies是完全隐藏起来的。这是一件好事,因为封装可以减少容易出错和较脆弱的代码。 ⏱ 2022-04-14 20:57:53

5.1 QA:值得吗

📌 在Web开发中,质量可以分解为四个维度: ⏱ 2022-04-14 22:13:12

📌 · 到达率到达率是指产品的市场普及程度,即查看网站或使用服务的人数。 ⏱ 2022-04-14 22:13:35

📌 ,搜索引擎优化(SEO)对到达率的影响最大,所以我们会在QA方案里包含SEO。 ⏱ 2022-04-14 22:14:53

📌 · 功能人们一旦访问了你的网站或使用了你的服务,能否把用户留下很大程度上取决于网站功能的质量: ⏱ 2022-04-14 22:13:41

📌 · 可用性功能关心的是功能的正确性,而可用性评估的是人机交互(HCI)。 ⏱ 2022-04-14 22:13:52

📌 · 审美审美是四个维度中最主观的,因此也是跟开发最不相关的一个维度。 ⏱ 2022-04-14 22:14:06

5.2 逻辑与展示

📌 网站上有两个“领域”:逻辑(经常被叫作“业务逻辑”,因为商业味儿比较浓,所以在这里没用这个词)和表示。 ⏱ 2022-04-14 22:15:17

📌 。这和表示是分开的。 ⏱ 2022-04-14 22:15:52

📌 因为逻辑域中的事情应该尽可能简单清晰,而表示域复杂还是简单则视需要而定。表示域还是可用性和审美问题要关注的课题,而业务域则不是。 ⏱ 2022-04-14 22:16:04

📌 你应该尽可能地在逻辑和表示之间划出清晰的界限。 ⏱ 2022-04-14 22:15:35

5.3 测试的类型

📌 本书要讨论的测试主要归为两大类:单元测试和集成测试(我认为“系统测试”属于集成测试) ⏱ 2022-04-14 22:20:03

5.4 QA技术概览

📌 去毛去毛不是要找错误,而是要找潜在的错误。去毛的一般概念是找出可能有错误的区域,或者可能在将来导致错误发生的问题代码。我们会用JSHint做去毛。 ⏱ 2022-04-14 22:37:33

5.6 页面测试

📌 对于页面测试,我建议把测试真正嵌入到页面中。这样做的优点是在做一个页面时,在浏览器中一加载页面就可以马上发现所有错误。 ⏱ 2022-04-15 21:38:43

📌 注意,我们用的是—save-dev而不是—save,这是告诉npm要把这个包放在开发依赖项中,不要放在运行时依赖项里。这样当我们部署网站的现场实例时,可以减少项目的依赖项。 ⏱ 2022-04-14 23:36:53

📌 因为Mocha要在浏览器中运行,所以我们要把Mocha资源放在public目录下,以便让客户端访问到。 ⏱ 2022-04-15 21:39:23

📌 把你用到的第三方库放在一个特殊的目录中是个好主意,比如vendor。这样比较容易分清哪些代码是需要你负责测试和修改的,哪些代码你不应该触碰。 ⏱ 2022-04-14 23:42:47

📌 Node框架中有这个函数,但浏览器中没有,所以我们要用Chai断言库 ⏱ 2022-04-15 21:39:37

📌 如果test=1出现在任何页面的查询字符串中(并且不是运行在生产服务器上),属性res. locals.showTests就会被设为true。res.locals对象是要传给视图的上下文的一部分(第7章会详细解释)。 ⏱ 2022-04-15 09:53:05

📌 在后续继续深入时,我们会有选择地链接每个页面特有的测试,这样你就可以针对不同的页面做不同的测试。 ⏱ 2022-04-15 10:28:25

📌 测试驱动开发(TDD)更具可行性,你描述的是测试集和其中的测试。你可以使用两种界面进行自己的测试,但会造成配置上的困难。因此我在本书中坚持使用TDD。 ⏱ 2022-04-15 10:28:46

📌 比如我们想确保“关于”页面上总是有一个指向“联系我们”页面的链接。 ⏱ 2022-04-15 10:03:17

8.1 向服务器发送客户端数据

📌 大体上讲,向服务器发送客户端数据有两种方式:查询字符串和请求正文。通常,如果是使用查询字符串,就发起了一个GET请求;如果是使用请求正文,就发起了一个POST请求 ⏱ 2022-06-20 12:36:04

📌 有一种普遍的误解是POST请求是安全的,而GET请求不安全。事实上如果使用HTTPS协议,两者都是安全的;如果不使用,则都不安全。 ⏱ 2022-06-20 12:36:18

9.4 会话

📌 会话的方法:把所有东西都存在cookie里,或者只在cookie里存一个唯一标识,其他东西都存在服务器上。前一种方式被称为“基于cookie的会话” ⏱ 2022-06-20 22:35:34

第10章 中间件

📌 从概念上讲,中间件是一种功能的封装方式,具体来说就是封装在程序中处理HTTP请求的功能。从实战上讲,中间件只是一个有3个参数的函数:一个请求对象、一个响应对象和一个next函数,稍后会作解释。(还有一种4个参数的形式,用来做错误处理,这会在本章末尾讲到。) ⏱ 2022-06-20 22:49:26

📌 在Express程序中,通过调用app.use向管道中插入中间件。 ⏱ 2022-06-20 22:49:38

📌 在Express 4.0中,中间件和路由处理器是按它们的连入顺序调用的,顺序更清晰。 ⏱ 2022-06-20 23:10:07

📌 在管道的最后放一个“捕获一切”请求的处理器是常见的做法,由它来处理跟前面其他所有路由都不匹配的请求 ⏱ 2022-06-20 23:10:18

📌 那么请求在管道中如何“终止”呢?这是由传给每个中间件的next函数来实现的。如果不调用next(),请求就在那个中间件中终止了。 ⏱ 2022-06-20 23:10:22

读书笔记

本书评论

书评 No.1

模板语言现在很少用到了,可以跳过,其他部分内容都还不错。

⏱ 2022-06-21 19:26:02