Node.js 后端全程实战

978-7-115-60891-8
作者: 凌杰
译者:
编辑: 李瑾
分类: Node

图书目录:

详情

本书是《JavaScript 全栈开发》在后端开发方面的续作。后端开发(也称服务端开发)指的是创建Web 应用在服务端的实现,并对它进行部署与维护的过程。要想成为一名全栈工程师,后端开发的技术栈是必须要全面了解并掌握的。本书将以基于 Node.js 运行平台的 Express.js 框架为工具为读者介绍开发并维护一个服务端应用所涉及的全部技术栈。 本书主体由两部分组成:第一部分以开发一个“线上简历”应用的服务端业务为演示项目,循序渐进地介绍使用 Express.js 框架开发服务端应用的具体实践过程;第二部分以“线上简历”应用的部署与维护工作为例,为读者介绍如何使用Docker、K8s 等运维工具来进行服务端应用的维护工作。 本书提供了一个可读性高、可被验证的示例项目(包含完整源代码),以帮助读者理解书中所介绍的技术的概念、开发框架以及 Web 应用的维护工具。本书适合已经对 JavaScript、HTML 和 CSS 等基本前端技术,以及 Node.js 运行平台有所了解,并对 Web 全栈开发及其设计理念感兴趣的读者阅读、使用。

图书摘要

版权信息

书名:Node.js 后端全程实战

ISBN:978-7-115-60891-8

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    凌 杰

责任编辑 李 瑾

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e60891”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

内 容 提 要

本书是《JavaScript全栈开发》在后端开发方面的续作。后端开发(也称服务端开发)指的是创建Web应用在服务端的实现,并对它进行部署与维护的过程。要想成为一名全栈工程师,后端开发的技术栈是必须要全面了解并掌握的。本书以基于Node.js运行平台的Express.js框架为工具为读者介绍开发并维护一个服务端应用所涉及的全部技术栈。

本书主体由两部分组成:第一部分以开发一个“线上简历”应用的服务端业务为演示项目,循序渐进地介绍使用Express.js框架开发服务端应用的具体实践过程;第二部分以“线上简历”应用的部署与维护工作为例,为读者介绍如何使用Docker、K8s等运维工具来进行服务端应用的维护工作。

本书提供了一个可读性强、可被验证的示例项目(包含完整源代码),以帮助读者理解书中所介绍的技术的概念、开发框架以及Web应用的维护工具。本书适合已经对JavaScript、HTML和CSS等基本前端技术及Node.js运行平台有所了解,并对Web全栈开发及其设计理念感兴趣的读者阅读、使用。

前  言

本书是本人“全栈三部曲”系列的收官之作。早在这个系列的第一本书——《JavaScript全栈开发》的审阅阶段,就不断有读者反馈说:只使用DOM和BOM接口来编写客户端应用,或者只使用Node.js运行平台的原生API来编写服务端应用,对于大多数人而言,都将是一个编码量巨大、调试和维护非常繁复的工作。诚然,《JavaScript全栈开发》作为本系列的基础篇,更倾向于为读者介绍JavaScript这门编程语言本身和客户机/服务器应用程序架构的理论基础,其中所演示的项目大多属于我们在实验环境中所进行的各种学习和研究活动。

在现实的生产环境中,开发者们大多时候是借助应用程序框架和专业的运维工具来开展具体项目的开发工作的。基本上,除了编程语言的基本语法之外,开发者的设计、开发能力很大程度上取决于如何根据自己面对的问题找到适用的框架,并在合理的时间内掌握该框架的使用方法,用它快速地构建自己的项目。因此在基础篇之后,我致力于利用具体的项目实践来向读者介绍如何培养这种“在做中学,在学中做”的能力。当然,框架和工具往往都是存在适用领域边界的。换而言之,我们在从事客户端应用的开发工作时,需要使用的是适用于该领域的框架及相关的项目构建工具,而在从事服务端应用的开发与维护工作时则要使用服务端领域的框架与相关的项目运维工具,它们各自可能都需要用一本书的篇幅来介绍。

因此,为了对《JavaScript全栈开发》在前端部分,即客户端开发方面的内容进行补充,我在去年出版了《Vue.js全平台前端实战》一书。在该书中,我以Vue.js框架及相关工具为例为读者介绍了客户端开发工作的相关实践。而本书则是在后端方面,即服务端开发方面的补充,将以Express.js框架及其相关的工具为例为读者介绍Node.js应用程序在服务端的开发与维护。

本书简介

简而言之,本书致力于探讨在服务端领域如何以基于Node.js运行平台的Express.js框架为中心,搭配Docker、Kubernetes等服务端运维工具,进行服务端应用的开发与维护工作。本书计划从Express.js框架的基本使用开始,循序渐进、层层深入地介绍HTTP服务的创建与开发、RESTful API的设计与实现、数据库接口设计与实现,以及服务端应用的部署与维护。在这个过程中,本书将提供大量可读性高、可被验证的代码示例,以帮助读者理解书中所介绍的技术的概念、编程思想与程序设计理念。

本书的主体由两部分组成。第一部分介绍的是Express.js框架的基本使用方法,这里将用4章的篇幅介绍Express.js框架本身的设计理念、核心组件、中间件机制以及项目组织方式等。这部分将会具体介绍如何利用Express.js框架创建一个基于RESTful API规范的服务端应用。第二部分将会介绍服务端应用的部署与运维工作。这部分也将用4章的篇幅具体介绍如何使用Docker、Kubernetes等服务端运维工具来实现对本书第一部分开发的应用程序的自动化部署与维护。下面是本书各章及附录的内容简介。

第1章:服务端开发环境。在正式开始服务端开发的议题之前,先用一章的篇幅带领读者进行一些必要的准备工作,目的是配备好后续章节中要使用的服务端环境以及相关的开发工具,并对相关的应用程序设计理念做概念性的介绍,帮助读者以最好的状态进入后续的项目实践中。

第2章:服务端开发方案。这一章首先对Express.js框架做简单的介绍,目的是让读者了解这一服务端框架的核心特性及其所能带来的开发优势。然后,分别演示使用Express.js框架实现服务端业务逻辑的两种不同方案,并根据“线上简历”这项应用的具体需求对该项目进行初始化配置和结构安排,目的是借助这一过程让读者了解基于Express.js框架来创建项目的基本步骤,以及这些步骤所反映的设计思路。

第3章:数据库接口设计。这一章将介绍数据库在服务端开发工作中所扮演的角色及其在Express.js框架中的使用方式。在介绍过程中,会分别基于关系数据库与非关系数据库的特点来探讨数据库的接口设计,并以MySQL、MongoDB这两种不同类型的数据库为例来演示如何在服务端项目中设计并实现访问数据库的API。

第4章:服务端接口实现。这一章会介绍如何使用API来实现应用程序的服务端业务逻辑,并演示如何根据REST设计规范来实现一个基于C/S架构的应用程序。在这一过程中,尝试在Express.js项目中引入一个基于Vue.js框架实现的客户端。

第5章:非容器化部署应用。这一章会具体演示如何将之前开发的“线上简历”应用程序部署到真正的服务器环境中,并以传统的、非容器化的方式对它进行维护。在这一过程中,依次为读者介绍服务端运维工作的主要内容、基本流程、所要使用的工具以及这些工具的具体使用方法。

第6章:应用程序的容器化。这一章将为读者介绍DevOps工作理念以及该理念所主张的容器化运维方式,它的作用是解决采用传统方式进行运维工作时所要面临的麻烦。毕竟,这些麻烦不仅会给运维工作带来高昂的成本,也会因思考角度上的完全不同而在运维与开发这两项工作之间产生一些难以调和的矛盾。

第7章:自动化部署与维护(上)。这一章将介绍服务端运维工作中的最后一项任务,即监控服务端应用在服务器上的运行状态,并对其进行日常维护。本章内容涉及采用微服务架构的必要性及其容器化实现方式、Docker Compose的安装方法和该工具的基本操作流程,以及如何在单服务器环境中实现应用程序的自动化部署与维护。

第8章:自动化部署与维护(下)。这一章将继续介绍如何在服务器集群环境中实现应用程序的自动化部署与维护。在这一过程中,带领读者具体了解Kubernetes这一功能更为强大的容器编排工具,并学习其基本使用方法。

附录A:Git简易教程。版本控制系统是一种在时间维度上维护计算机程序项目的软件系统,它的功能是方便开发者记录并管理自己在某个特定时间节点上编写的代码,以便在必要时实现一些“有后悔药吃”的效果。在这篇附录中,我们将以Git这个分布式版本控制系统为例来为读者介绍这类软件工具的基本使用方法。

附录B:使用Vagrant搭建K8s服务器集群。我们在使用VMware、VirtualBox这一类虚拟机软件创建虚拟开发环境时,往往需要经历寻找并下载操作系统的安装镜像文件,然后根据该镜像文件启动的安装向导一步一步地安装与配置操作系统,最后从零开始安装开发与运维工具的过程,整个过程非常费时、费力。在这篇附录中,我们将为读者具体介绍Vagrant这个自动化虚拟机管理工具的基本使用方法,并演示如何使用它来虚拟化一个由3台服务器构成的K8s服务器集群。

读者须知

由于本书是一本专注于介绍如何使用Express.js框架进行开发,并对开发结果开展运维工作的书,而Express.js是一个基于Node.js运行平台的服务端应用开发框架,所以希望读者在阅读本书之前已经掌握了JavaScript语言、Node.js原生接口的基本使用方法,并了解与HTTP相关的服务器的概念等基础知识。如有需要,建议读者先阅读一下本书的前作——《JavaScript全栈开发》,或者其他介绍上述基础知识的图书。

当然,由于JavaScript社区的开发框架不仅琳琅满目、选择众多,而且新陈代谢极为快速,这意味着等到本书写完并最终出版之时,开发者在服务端领域很有可能已经有了比Express.js框架更好的选择。所以基于“授之以鱼不如授之以渔”的原则,本书的目的是帮助读者培养快速学习任意一种新框架的能力,这需要读者更深入地去理解服务端框架的设计思路,理解为什么决定开放一些接口给用户,为什么对用户隐藏一些实现,也就是需要读者自己具备开发框架的能力。换句话说,虽然不必重复发明轮子,但一名优秀的工程师或设计师应该了解轮子是如何被发明的,这样才能清楚基于什么样的轮子构建什么样的车。

除此之外,我在这里还需要特别强调一件事:本书中所有关于“线上简历”应用的实现代码都是基于本书各章节中的代码占比及其阅读体验等众多写作因素进行了平衡考虑之后形成的最简化版本,其中省略了绝大部分与错误处理及其他辅助功能相关的代码。因此,如果想了解实际项目中某些具体问题的解决方案,还请读者自己去查阅本书配套资源中的内容。当然,在我个人看来,如果想要学好并熟练掌握一个开发框架,最好的办法就是尽可能地在实践中使用它,在实际项目需求的驱动下模仿、试错并总结使用经验。所以,我并不鼓励读者直接复制/粘贴本书配套资源中的演示代码,而更期待读者“自己动手”去模仿,亲手将自己想要执行的代码输入计算机,观察它们是如何工作的。然后,试着修改它们,并验证其运行结果是否符合预期。如果符合预期,就总结当下的经验;如果不符合预期,就思考应该做哪些调整来令其符合预期。如此周而复始,才能让学习效果事半功倍。

致谢与勘误

本书能够出版,离不开很多人的鼓励和帮助,在这里我需要感谢很多人。如果没有我的好朋友、卷积文化传媒(北京)有限公司的创始人高博先生的提议,我极有可能下不了创作本书的决心。如果没有人民邮电出版社信息技术出版分社的陈冀康社长和编辑的鼓励和鞭策,我也可能完成不了本书。我还要感谢朱磊、胡世杰两位好友的帮助,他们对本书的初稿进行了认真的审阅,提供了不少宝贵的建议。感谢人民邮电出版社愿意出版这本题材和内容也许并没有那么大众化的书,希望不会辜负他们的信任。我也需要特别感谢我的家人,感谢你们对我无微不至的照顾和给我的温暖的爱,这些都是我在这个世界上奋斗的动力。

当然,无论如何,本书中都会存在一些不妥及疏漏之处。如果您有任何意见,希望您致信lingjiexyz@hotmail.com或者在异步社区本书的勘误页面中提出,以帮助我们在后续修订中进一步完善它。

 

2022年10月

资源与支持

本书由异步社区出品,社区(https://www.epubit.com)可为您提供相关资源和后续服务。

您还可以扫码二维码, 关注【异步社区】微信公众号,回复“e60891”直接获取,同时可以获得异步社区15天VIP会员卡,近千本电子书免费畅读。

配套资源

本书提供书中示例的源代码。

您可以在异步社区本书页面中单击,跳转到下载页面,按提示进行操作。

提交勘误信息

作者和编辑尽最大努力来确保书中内容的准确性,但难免存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“发表勘误”,输入错误信息,单击“提交勘误”按钮(见下图)。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书和奖品。

扫码关注本书

扫描下方的二维码,您将会在异步社区微信服务号中看到本书信息及相关的服务提示。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/ contribute即可)。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”是人民邮电出版社旗下IT 专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号

第一部分 服务端项目的开发

然我们要以Express.js为核心来展开项目的实践讨论,那么如何使用这个框架进行项目开发就是读者首先要解决的问题了。所以在本书的第一部分内容中,我们将会用4章的篇幅具体演示如何基于Express.js框架开发一个名为“线上简历”的Web应用程序。在演示过程中,我们将会侧重于探讨在实现Web应用程序的服务端业务逻辑时会遇到的问题。本部分涉及的4章如下。

第1章 服务端开发环境

第2章 服务端开发方案

第3章 数据库接口设计

第4章 服务端接口实现

第1章 服务端开发环境

本书的第一部分致力于探讨如何围绕基于Node.js运行平台的Express.js框架来开发一个客户机/服务器(Client/Server,C/S)应用程序的服务端部分。这意味着读者将会接触到一系列服务端的开发工具,以及这些工具所代表的应用程序设计理念。所以在正式开始服务端开发的议题之前,我们需要先做一些必要的准备工作,目的是配备好后续章节中要使用的服务端环境以及相关的开发工具,并对相关的应用程序设计理念做概念性的介绍,帮助读者以最好的状态进入后续的项目实践中。因此在阅读完本章之后,我们希望读者能够:

了解服务器端操作系统的发展历程以及选择策略;

了解如何构建并配置服务端应用程序的开发环境;

了解如何根据开发环境来安装并配置数据库系统。

1.1 安装操作系统

从编程方法上来说,无论是Android/iOS应用程序,还是微信/支付宝小程序,抑或是传统的Web应用程序,它们在理论上都属于C/S架构的应用程序。在这种架构之下,开发者们通常会将应用程序中需要保障数据安全或者进行大规模计算的那一部分业务逻辑部署在服务器上,以便享受服务器的高性能配置以及能就近维护的便利,我们通常将这部分业务逻辑的实现称为应用程序的服务端开发(或后端开发)。然后根据服务端开发的成果,我们会继续针对该应用程序的用户可能使用的设备或Web浏览器来进行解决人机交互问题的开发工作,这部分工作则通常被称为应用程序的客户端开发(或前端开发)。显而易见地,C/S架构既能有效地降低应用程序部署与维护的成本,也能在很大程度上减少应用程序对用户侧的软硬件依赖,同时还能明确整个项目进行过程中的任务划分,因此成了当前最受欢迎的应用程序开发架构之一。

正如前文所说,由于本书的内容主要聚焦于应用程序在服务端业务部分的开发和维护,所以我们的工作将主要在服务器上进行。因此在一切工作开始之前,首先要做的就是构建好一个可供使用的服务端开发环境。而具体到服务端开发环境的构建,除了根据项目开发的具体需求来为服务器配置适用的CPU、内存、硬盘等硬件之外,我们的首要任务就是为其选择一个合适的操作系统。

1.1.1 服务器操作系统概况

在当前市场上,在服务器领域主要有Windows Server和类Linux系统两种可供选择的操作系统。其中,Windows Server是微软公司专为服务器设计的专有操作系统,由于该系统上的大部分操作都可以通过图形化界面来完成,所以原则上应该具有更低的使用门槛,更方便非专业的服务端工作者学习和使用。然而,由于Windows Server早期并不是面向多用户服务器设计的,这使它成了服务器操作系统领域的后来者,以至于在相当长的一段时间内,很多成熟的服务器软件在开发时基本上不考虑支持Windows Server系统。所以,虽然Windows Server的后期版本也引入了对POSIX标准(我们稍后会具体解释这一标准的来龙去脉)的支持,大大改善了其在面对Linux生态时的可扩展性和兼容性,但其软件生态与市场占有率依然远远不及以Linux为内核的操作系统。

毕竟,Linux从一开始就是一款专为多用户服务器环境而构建的操作系统,它很早就支持不同用户共同登录系统,且运行稳定、高效,具有丰富的开源软件生态,所以一直占据着服务器操作系统领域的主要市场份额。当然,凡事没有十全十美,由于在类Linux系统上的操作大部分要通过终端的方式来进行,所以对执行相关操作的工作人员来说,对专业的要求往往是比较高的,他们通常都需要经历系统性的专业培训。

在本书中,我们将选择基于类Linux系统来构建服务端的开发环境,这在很大程度上也是目前Web应用服务端开发领域的主流选择。

1.1.2 为什么选择类Linux系统?

关于类Linux系统在服务器操作系统市场中占主导地位的原因,如今业界有很多解释都倾向于批评Windows Server系统有可扩展性差、不够安全之类的缺点,我个人认为这种说法多少有点儿倒果为因的嫌疑。这个问题真正的解释,很大程度上在于只是两种操作系统在这一领域有先来后到之分,且先来者有权制定标准罢了。

如果我们简单回顾一下历史就会发现,操作系统的发展动力源自人们在使用计算机时的任务管理需求。众所周知,在计算机发展的启蒙时代,计算机上执行的任务都是由操作人员手动编排的。而随着要执行的任务越来越多,这种靠人力来编排任务的执行方式就越来越不能体现计算机的效率优势了,于是出现了能进行自动化任务管理的批处理系统,这是最早期的计算机操作系统。但批处理系统只解决了任务在执行顺序上的编排问题,没有解决任务在等待输入期间的计算资源闲置问题,于是人们就开发出了能更合理分配计算资源的分时任务系统。而分时任务系统的出现也赋予了计算机同时应对多个用户的功能,这项功能使得不同的用户可以在同一时间段内共享同一台计算机上的资源,这个系统正是当今所有服务器操作系统的原型。

然后,越来越多型号各异的计算机被生产出来,且这些计算机设备的厂商都会为其配上专用的操作系统(例如,今天的苹果公司依然在坚持这个做法),这意味着用户在更换不同型号的计算机时就不得不学习新的操作系统,这是非常不利于计算机设备的普及的。为了解决这一问题,通用操作系统的概念随即出现。这一概念倡导让操作系统独立于硬件,以求在不同硬件上提供相似的用户体验。在诸多通用操作系统中,UNIX脱颖而出并自然而然地成了服务器操作系统的主导者,也正是在UNIX的发展过程中,业界共同制定出了POSIX标准。

POSIX是由理查德·马修·斯托尔曼[1]应IEEE的要求而提出的一个易于记忆的名称。其中,POSI是Portable Operating System Interface(可移植操作系统接口)的英文缩写,而X则表明其对UNIX API(Application Program Interface,应用程序接口)的传承。这个名称实际上是IEEE为在各种UNIX操作系统上运行软件而定义的一组相关API标准的总称,该标准使得各个UNIX操作系统之上的C程序重新编译即可运行,无须修改代码。也正是因为有了POSIX标准,原本就致力于重新实现UNIX接口的Linux项目才能凭借着开源的优势迅速在服务器操作系统市场上占据主导地位。另外,Windows则因为早期专注于个人计算机领域,忽视了对POSIX标准的遵守,因而失去了服务器操作系统市场的先机,成了后来者。

[1] 理查德·马修·斯托尔曼(Richard Matthew Stallman),美国程序员、自由软件活动家。他发起了“自由软件运动”,倡导软件用户能够对软件自由进行使用、学习、共享和修改,确保了这些软件被称作自由软件。斯托尔曼发起了GNU项目,并成立了自由软件基金会。他开发了GCC、GDB、GNU Emacs,同时编写了GNU通用公共许可协议。

当然,对于一个在服务器上开发服务端应用的开发者来说,在选择服务器操作系统时除了要考虑操作系统的市场份额之外,最重要的是要考虑自己的实际开发需求。通常情况下,我们可以根据自己要使用的编程语言、应用程序框架、数据库来进行选择。例如我们要使用的编程语言是C#,应用程序框架为ASP.NET,数据库为SQL Server,那么毫无疑问应该选择Windows Server系统。而在本书中,我们使用的编程语言是JavaScript,应用程序框架是Express.js,数据库是MongoDB,那么类Linux系统无疑是更好的选择。除此之外,我们选择的服务端运维工具也应该被列为选择服务器操作系统时的考虑因素,例如在本书的第二部分中,我们将使用Docker来充当运维工具,而Docker和大多数开源软件类似,优先支持的都是类Linux系统,这也是我们在本书中最终选择类Linux系统来构建服务端开发环境的原因。下面,我们进一步总结一下Linux系统在服务端所能发挥的优势。

Linux系统通常对计算机硬件要求较低,且大部分都可以免费获取,能有效地降低运维成本。

原生Linux支持多用户多进程系统,相对而言更适合被用作服务器操作系统。

Linux本身是基于计算机网络的操作系统,原生Linux支持所有TCP/IP。

Linux得到了开源社区的强力支持,像Apache、Docker这类开源软件都会优先在Linux上实现。

由于Linux兼容UNIX的大部分接口,而UNIX是早期的服务器操作系统“霸主”,所以Linux很好地继承了其主导地位。

1.1.3 安装并配置Linux发行版

在正式介绍如何为服务器安装类Linux系统之前,我们需要先普及一个概念:Linux本身只是一个操作系统的内核实现项目,它严格来说并不是一个完整、可用的操作系统。所以我们之前一直称这一类操作系统为Linux系统,它指的是某一种以Linux为内核的操作系统,这些操作系统通常被称为Linux发行版。在我个人看来,目前在服务端上主流的Linux发行版主要可分为以下三大分支。

以Debian项目为基础的发行版:包括Ubuntu、Deepin等,使用的是APT包管理器,主要用于个人用户,目前是市面上较为流行的Linux分支。

以Red Hat项目为基础的发行版:包括CentOS、Fedora等,使用的是YUM或DNF包管理器。由于Red Hat本身是一个企业级系统,所以它比较适合需要稳定的企业级用户。

以Arch Linux项目为基础的发行版:主要代表是Manjaro,使用的是Pacman包管理器。软件为滚动式更新,策略比较激进,稳定性不充分。

由于我们接下来打算为读者演示Web应用在服务端的开发与维护工作,因此需要既有相对友好的图形化界面,又能兼顾服务端运行和维护的Linux发行版。在本书中,我们决定基于Ubuntu这个Linux发行版来构建Web服务端的开发与维护环境,主要原因是该发行版的定制化程度比较高,故而在系统安装和配置方面要做的事都相对简单,不至于花费过多的时间。当然,读者也可以利用Arch Linux这个发行版,从基本的系统开始,一步一步地手动构建自己所需要的图形化界面和服务器环境,这并不会影响本书大部分内容的阅读体验。

Ubuntu系统的具体安装过程非常简单,网上的教程很多,内容也都大同小异,基本上按照以下步骤做即可。

1. 在Ubuntu官方网站下载合适的安装镜像文件,如图1-1所示。在本书中,我选择的是ubuntu-20.04.3-desktop-amd64.iso镜像文件。

图1-1 下载Ubuntu的安装镜像文件

2. 如果读者要在一台实体机上安装Ubuntu,还需要准备一个存储容量大于4GB的U盘,并使用U盘刻录软件将其制作成Ubuntu的系统安装盘。当然,如果是在虚拟机上安装Ubuntu,这一步就可以跳过了。

3. 将Ubuntu的系统安装盘插入要安装系统的目标设备,并让该设备从该系统安装盘启动。待其加载完安装程序之后,在欢迎界面选择系统要使用的语言[这里选择“中文(简体)”],并单击“安装Ubuntu”按钮开始正式安装。

4. 根据系统安装向导执行以下操作。

在设置“键盘布局”时选择“英语(美国)”。

在设置“更新和其他软件”时,取消勾选“安装Ubuntu时下载更新”复选框。

在设置“安装类型”时,如果没有双系统方面的需求,建议选择“其他选项”,让系统自动分配分区。

在设置“你在什么地方”时,选择自己所在的时区,这里选择“上海”。

在设置“您是谁?”时,输入自己的名字、目标设备的名称、登录系统时所要使用的用户名和密码等信息。

5. 待执行完系统安装向导的所有操作后,会提示重启设备。这时候需先取出系统安装盘,让设备从硬盘重启。这样一来,就能在设备重启之后进入Ubuntu系统的桌面环境了。接下来,我们需要对系统进行一些基本配置。

由于某些不可抗力的存在和客观物理网络的问题,所以在安装完Ubuntu之后,我们要做的第一件事应该就是将APT的软件源改成国内的镜像。这里选择的是阿里云的源,替换的具体操作如下。

备份一下原有的国外源,以备日后需要时将其恢复。

         cd /etc/apt
         sudo cp sources.list sources.list.bak

用编辑器打开源配置文件sources.list,将其内容修改如下。

         # 使用阿里云的源
         deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
         deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
         deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

更新一下系统。

         sudo apt update && sudo apt upgrade

在本书中,我们会在一个虚拟机环境中构建服务端开发环境,在该虚拟机中安装并配置完Ubuntu的效果如图1-2所示。

当然,在经济条件允许的情况下,我们也可以选择向阿里云、腾讯云、亚马逊云等云服务提供商购买相关的云服务器。这样一来,我们不仅可以要求云服务提供商为自己安装好指定的Linux发行版,以免去一堆烦琐且容易出错的系统安装和配置操作,也可以在发现自己选错了操作系统时,随时向云服务提供商申请将云服务器中原有的操作系统替换成其他Linux发行版,甚至是Windows Server系统。

图1-2 安装并配置完Ubuntu的效果

1.2 安装开发工具

由于本书将介绍如何基于Express.js这个服务端框架来开发应用程序的服务端,而该服务器框架又是基于Node.js平台运行的,所以我们接下来的任务就是安装好Node.js运行平台。

1.2.1 Node.js运行平台

Node.js运行平台主要有两种安装方式。通常在Windows和macOS这一类的图形化操作系统中,我们会下载MSIDMG格式的二进制安装包,然后使用图形化向导的方式来进行安装。而在Ubuntu这类基于Debian项目的Linux发行版中,我们往往选择使用APT这一类的包管理器来完成这个任务,这简单而方便,依次执行以下命令即可。

sudo apt install nodejs
# 最新的 Node.js 已经集成了 NPM,所以通常无须单独安装
sudo apt install npm

当然,由于APT软件源中提供的Node.js版本通常是比较陈旧的,为了随时能将其切换到我们需要的版本,还必须要通过执行sudo npm install n --global命令安装一个名为n的Node.js的版本管理器。这样一来,我们就可以使用如下命令来切换Node.js的版本了。

sudo n lts            # 切换至最新的长期支持版
sudo n stable         # 切换至最新的稳定版
sudo n latest         # 切换至最新版
sudo n 15.1.0         # 切换至指定的版本
sudo n                # 执行该命令之后,可使用上、下键切换之前已安装过的版本

如果一切顺利,在我们打开bash这一类终端,并在其中执行node -v命令之后,应该就会看到相关的版本信息了。

1.2.2 项目开发环境

从理论的角度上来说,要想编写一个基于Node.js运行平台的服务端应用程序,通常只需要使用任意一款纯文本编辑器。但在具体的项目实践中,为了在工作过程中获得代码的语法高亮与智能补全等功能以提高编码体验,并能方便地使用各种强大的程序调试工具和版本控制工具,我们通常会选择使用一款专用的代码编辑器或集成开发环境(IDE)来完成项目开发。在本书中,我个人倾向于推荐读者使用Visual Studio Code编辑器(以下简称VSCode编辑器)来开发所有的项目。下面就让我们来简单介绍一下这款编辑器的安装方法,以及如何将其打造成一个可用于开发Node.js项目的开发环境。

VSCode是微软公司于2015年推出的一款现代化代码编辑器,由于它本身就是一个基于Electron框架的开源项目,所以它在Windows、macOS、类Linux系统上均可使用(这也是我选择它作为主编辑器的原因之一)。VSCode编辑器的安装非常简单,在浏览器中打开它的官方下载页面之后,就会看到如图1-3所示的内容。

图1-3 VSCode的官方下载页面

然后,需要根据自己的操作系统下载相应的安装包。待下载完成之后,我们就可以打开安装包来启动它的图形化安装向导了。在安装的开始阶段,安装向导会要求用户进行一些设置,例如选择程序的安装目录、确定是否添加相应的环境变量(如果读者想从终端中启动VSCode编辑器,就需要勾选相应复选框)等,大多数时候只需采用默认设置,直接一直单击“Next”就可以完成安装。接下来的任务就是要将其打造成可用于开发Node.js项目的环境。

VSCode编辑器的强大之处在于它有一个非常完善的插件生态系统,我们可以通过安装插件的方式将其打造成面向不同编程语言与开发框架的集成开发环境。在VSCode编辑器中安装插件的方式非常简单,只需要打开该编辑器的主界面,然后在其左侧纵向排列的图标按钮中找到“扩展”按钮并单击它,或直接按快捷键“Ctrl + Shift + X”,就会看到如图1-4所示的插件安装界面。

图1-4 VSCode的插件安装界面

根据开发Node.js项目的需求,我在这里推荐读者安装以下插件(但并不局限于这些插件)。

GitLens:该插件用于查看开发者们在Git版本控制系统中的提交记录。

vscode-icons:该插件用于为不同类型的文件加上不同的图标,以方便文件管理。

HTML Snippets:该插件用于在编写HTML代码时实现一些常见代码片段的自动生成。

IntelliSense for CSS class names in HTML:该插件用于在编写CSS和HTML代码时实现自动补全功能。

ESlint:该插件用于检测JavaScript代码的语法问题与格式问题。

JavaScript Snippet Pack:该插件用于在编写JavaScript代码时实现自动补全功能。

npm:该插件可用package.json来校验安装的NPM包,确保安装包的版本正确。

Node.js Modules IntelliSense:该插件可用于在代码中导入指定Node.js模块时实现自动补全功能。

npm IntelliSense:该插件可用于在代码中编写npm命令时实现自动补全功能。

Import Cost:该插件用于显示当前代码中引入Node.js模块的文件大小。

Path IntelliSense:该插件用于在代码中指定文件路径时实现自动补全功能。

Node.js Exec:该插件可用Node命令执行当前文件或被我们选中的代码。

Node Debug:该插件可实现直接在VSCode编辑器中调试后端的JavaScript代码。

Rest Client:该插件可以在不使用浏览器或curl这一类程序的情况下实现对RESTful API的测试,它可以直接在编辑器内交互式地向服务端发送HTTP请求,并接收其响应信息。

当然,VSCode编辑器的插件数不胜数,读者也可以根据自己的喜好来安装其他功能类似的插件,只要这些插件满足后面的项目实践需求即可。除此之外,Atom与Sublime Text这两款编辑器也与VSCode有着类似的插件生态系统和使用方式,如果读者喜欢的话,也可以使用它们来打造属于自己的项目开发环境。

除了上述专用代码编辑器之外,如果读者更习惯使用传统的集成开发环境,JetBrains公司旗下的WebStorm无疑是一个不错的选择,它在Windows、macOS、类Linux系统上均可做到所有的功能都开箱即用,无须进行多余的配置,已经被广大的JavaScript开发者誉为“最智能的JavaScript集成开发环境”。WebStorm的安装方法非常简单,我们在浏览器中打开它的官方下载页面之后,就会看到如图1-5所示的内容。

同样地,在这里需要根据自己的操作系统下载相应的安装包,待下载完成之后就可以打开安装包来启动它的图形化安装向导了。在安装的开始阶段,安装向导会要求用户进行一些设置,例如选择程序的安装目录、确定是否添加相应的环境变量、确定关联的文件类型等,大多数时候只需采用默认设置,直接一直单击“Next”就可以完成安装。当然,令人比较遗憾的是,WebStorm并非一款免费的软件。如果考虑到在实际生产环境中要支付的费用等因素,我个人还是建议读者尽可能地选择开源软件。

图1-5 WebStorm的官方下载页面

1.3 安装数据库

众所周知,数据库服务通常被认为是服务端应用的重要组成部分,毕竟在我们日常所能接触到的、基于C/S架构的应用程序中,绝大多数服务端部分的核心业务都与大量数据的增、删、改、查操作密切相关。因此,数据库在Node.js项目中的使用方式,也是我们在介绍基于Express.js框架的服务端开发时绕不开的重要议题之一。为了做好这方面的演示工作,我们需要在之前准备好的Ubuntu操作系统环境中分别安装代表关系数据库的MySQL和代表非关系数据库的MongoDB,以便在第3章中讨论并示范如何围绕着它们开发一组专用于执行数据库操作的API。

1.3.1 MySQL数据库

MySQL是传统关系数据库领域的经典产品之一,原本是瑞典MySQL AB公司开发的一款开源的数据库管理系统,但目前已归Oracle公司所有。它相对于其他关系数据库具有以下优势。

MySQL使用C/C++编写而成,并使用了多种编译器进行测试,这赋予了它很好的可移植性,使它支持包括Windows、macOS以及其他各种UNIX/Linux发行版在内的多种操作系统。

MySQL为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、JavaScript、PHP等。

MySQL既能够作为一个单独的应用程序被部署在C/S架构的服务端中,也能够作为一个库而嵌入其他的软件中。

MySQL支持TCP/IP、ODBC和JDBC等多种数据库连接途径,并提供了丰富的数据库客户端管理工具。

MySQL目前提供社区版和商业版两种选择,在使用社区版时可以享用其在开源社区的各种成果,且无须支付任何费用。

在Ubuntu系统中安装MySQL数据库,通常有Ubuntu Software Center图形化安装和APT终端式安装两种方式,下面我们就分别介绍它们。

1. Ubuntu Software Center图形化安装:如果选择这种安装方式,我们只需在Ubuntu系统的图形化界面中打开Ubuntu Software Center,并单击左上角的放大镜按钮,然后在弹出的搜索框中输入“MySQL”关键词并查询,最后选定MySQL安装项目,单击“安装”即可,如图1-6所示。

图1-6 Ubuntu Software Center图形化安装

2. APT终端式安装:如果选择这种安装方式,我们只需打开bash这样的终端环境,并执行sudo apt install mysql-server命令即可,如图1-7所示。

图1-7 APT终端式安装

在成功安装MySQL后,我们就可以通过sudo mysql -u root -p命令直接使用root账户登录到该数据库管理系统中,具体如下。

$ sudo mysql -u root -p
Enter password: <在此处直接按“Enter”键>
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.30-0ubuntu0.20.04.2 (Ubuntu)
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names 
may be trademarks of their respectiveowners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> 

正如读者所见,root账户在默认情况下是没有设置密码的。如果想保证数据库的安全,就需要第一时间给root账户设置密码。为此,我们就需要在上面的MySQL命令提示符后面继续执行如下命令。

mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "<你的密码>";

在这里,读者只需将上述命令中的“<你的密码>”替换为自己要设定的密码即可。在成功设置密码之后,如果我们再以root账户登录就需要输入密码了。当然,由于root账户拥有数据库的所有操作权限,因此不能轻易把root账户给别人用。而且,我们在同一个MySQL服务中通常会需要创建多个数据库,这些数据库可能分属不同的项目。因此我们通常会为不同的数据库分配不同的用户,例如像下面这样。

# 先使用root账户创建一个数据库
mysql> create database online_resumes
# 然后将这个数据库分配给一个叫owlman的用户
mysql> GRANT ALL PRIVILEGES ON online_resumes.* TO owlman@localhost IDENTIFIED BY "owlman120";

这样一来,我们就可以使用sudo mysql -u owlman -powlman120命令以owlman账户来登录本机的MySQL数据库,并操作online_resumes数据库了,具体如下。

$ sudo mysql -u owlman -powlman120
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.30-0ubuntu0.20.04.2 (Ubuntu)
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names 
may be trademarks of their respectiveowners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| online_resumes     |
| test               |
+--------------------+
3 rows in set (0.00 sec)
 
mysql> 

1.3.2 MongoDB数据库

MongoDB通常被视为近年来最为流行的非关系数据库之一。这得益于该数据库介于关系数据库和非关系数据库之间的设计,使得它成了非关系数据库当中功能丰富,同时又像关系数据库的一个产品。MongoDB相较于其他非关系数据库,具有以下优势。

MongoDB主要用C++编写而成,这赋予了它在Windows、macOS以及其他各种UNIX/Linux发行版在内的多种操作系统上的可移植性。

MongoDB用于存储数据的文档结构非常类似于JSON格式的文档结构,这种松散自由的数据结构有助于存储结构较为复杂的数据信息。

MongoDB支持的查询语言非常灵活且强大,该语言在用法上与面向对象的编程语言非常类似,且可以实现类似关系数据库单表查询的绝大部分功能,这有效地降低了开发人员使用数据库的门槛。

MongoDB本质上就是一个实现了分布式存储的文档管理系统,这使得它相较于传统的关系数据库更适合用于开发基于RESTful API规范的服务端应用,并将其部署于服务器集群中。

MongoDB也提供社区版和商业版两种选择,在使用社区版时可以享用其在开源社区的各种成果,且无须支付任何费用。

在Ubuntu系统中安装MongoDB数据库,通常是利用APT包管理器的命令行工具来完成的,但在该包管理器所使用的软件仓库上,我们有以下两种方式。

使用Ubuntu的官方软件仓库来安装,这种方式不需要对APT包管理器进行额外的配置,但安装的通常不是最新版本的MongoDB。如果我们采用这种方式,需要在bash这样的终端中执行以下操作。

         # 第 1步:将系统更新到最新状态
         sudo apt update && sudo apt upgrade -y
 
         # 第 2 步:执行安装 MongoDB的命令
         sudo apt install mongodb -y

使用MongoDB提供的官方仓库安装,这种方式一定可以安装到最新版本的MongoDB,但需要对APT包管理器进行额外的配置,过程会略微复杂一些。如果我们采用这种方式,需要在bash这样的终端中执行以下操作。

         # 第 1 步:导入 MongoDB 官方的 APT 公钥
         sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
 
         # 第 2 步:向APT包管理器的软件列表中添加一个MongoDB的官方仓库
         echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
 
         # 第 3 步:更新包管理器的数据库
         sudo apt update
 
         # 第 4 步:执行安装命令,要安装的软件包名为 mongodb-org
         sudo apt install mongodb-org -y
 
         # 或者通过在 = 后面指定版本号来安装特定版本的MongoDB,例如
         sudo apt install -y mongodb-org=4.0.6 mongodb-org-server=4.0.6 mongodb-org-shell=4.0.6 mongodb-org-mongos=4.0.6 mongodb-org-tools=4.0.6

通常情况下,MongoDB的服务应该会在安装完成时自动启动,我们可以通过sudo systemctl status mongodb命令来检查该服务的状态。如果该命令返回如图1-8所示的信息,就证明MongoDB数据库已经被成功地安装到了当前计算机中。

图1-8 检查MongoDB服务的状态

正如读者所见,MongoDB数据库目前是以systemd服务的形式运行在Ubuntu系统中的,所以我们在该数据库的日常维护中需要使用以下命令来操作它。

# 检查MongoDB服务的状态
sudo systemctl status mongodb
# 停止MongoDB服务
sudo systemctl stop mongodb
# 启动MongoDB服务
sudo systemctl start mongodb
# 重启MongoDB服务
sudo systemctl restart mongodb
# 将MongoDB服务设置为随系统启动
sudo systemctl disable mongodb
# 将MongoDB服务设置为不随系统启动
sudo systemctl enable mongodb

1.3.3 关于数据库的容器化

需要特别说明的是,我们在这里介绍的是在开发环境中的数据库安装方式。由于我们在开发环境中会追求对数据库的最大自由配置权,因此通常会采用手动安装和配置的方式来部署数据库。但在生产环境中,我们追求的则是数据库配置的稳定性以及可移植性。所以在生产环境中部署数据库时,人们更多时候会选择使用Docker容器的方式。关于这方面的议题,我们将会在本书的第二部分为读者做详细介绍。

读者服务:

微信扫码关注【异步社区】微信公众号,回复“e60891”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。

相关图书

Node学习指南 第2版
Node学习指南 第2版
Tomcat内核设计剖析
Tomcat内核设计剖析
写给PHP开发者的Node.js学习指南
写给PHP开发者的Node.js学习指南
Node学习指南
Node学习指南
Node应用程序构建——使用MongoDB和Backbone
Node应用程序构建——使用MongoDB和Backbone
Node.js入门经典
Node.js入门经典

相关文章

相关课程