如何部署 Node.js 应用程序?
本文将介绍如何部署 Node JS 应用程序。我们将讨论 Node 的优缺点和部署选项,包括 IaaS、PaaS 和 BaaS。最后,我们将在 Back4app 上部署一个 Node 应用程序。
什么是 Node.js?
Node.js是基于 Chrome 浏览器V8 JavaScript 引擎的开源跨平台 JavaScript 运行时。Node 的目标是通过允许 JavaScript 开发人员编写服务器端操作代码,让他们能够实现全栈开发。它的用例包括服务器端脚本、实时应用程序、流网络应用程序、单页面应用程序(SPA)、协作工具和网络游戏。
Node 采用事件驱动架构,能够实现异步 I/O。由于它能将 JavaScript 编译成本地机器代码,因此速度极快。它可以处理大量的活动连接,让开发人员可以轻松构建可扩展的高性能应用程序。
早在 2009 年,该技术的创建者 Ryan Dahl 就在一年一度的欧洲 JSConf 上首次介绍了该技术。它立即成为 JavaScript 生态系统中最有趣的软件之一。
Node 的受欢迎程度在 2017 年达到顶峰,并保持高位。它是最流行的开发工具之一,被 IBM、LinkedIn、Microsoft、Netflix 等众多千万级公司所采用。它的简单性和扩展能力使其非常适合各种规模的公司–包括初创公司。
在接下来的两节中,我们将深入探讨 Node 的优缺点。
Node.js 的优势
高性能
正如前言所述,Node 由 Google 的高性能 JavaScript 引擎提供支持。V8 能以快如闪电的速度编译和执行 JavaScript,这主要是因为它能将 JavaScript 编译成本地机器代码。
尽管 JavaScript 是一种单线程编程语言,但 Node 还使用了事件循环,允许执行非阻塞 I/O 操作。这使其成为市场上速度最快的选择之一。
可扩展性
Node.js 的主要优势之一是其扩展能力。Node 应用程序可以横向和纵向扩展。横向扩展是通过在现有系统中添加额外节点来实现的,而纵向扩展则是指在特定节点上添加额外资源。该平台强大的扩展选项使其既适用于初创公司,也适用于 LinkedIn、Netflix 和 PayPal 等每天拥有数千万用户的大公司。
Node 还非常适合微服务架构,允许开发人员创建适合持续交付管道的小型组件,并可轻松按需扩展。
简单易学
Node 以 JavaScript 为基础,对于已经掌握 JavaScript 基础知识的开发人员来说,学习起来非常容易。它的学习曲线并不陡峭,几周内就能掌握。Node 的简单性使其非常适合所有类型的项目。
更快上市
上市时间是许多开发团队的基本基准之一。每个人都希望尽快将自己的产品推向市场,而 Node 可以让您做到这一点。
Node 的简单性和大量的 npm 软件包大大缩短了上市时间。GitHub 和其他平台上有大量开源项目,可以用作模板,让您的项目尽快启动和运行。
久经考验的工具
Node 是一款久经考验的成熟工具,自 2009 年起就已问世。其稳定性已通过 eBay、Netflix 和 LinkedIn 等大公司的测试,这些公司每天都有数百万用户。
由于 Node 的强大功能,它被纳入了许多技术堆栈(通常与 Express 和 NoSQL 数据库结合使用)。包含 Node 的一些技术栈包括
- 教育网
- 平均值
- DERN
伟大的社区
Node.js 拥有一个由开发人员和爱好者组成的强大而活跃的社区,他们不断为 Node 做出贡献,使其变得越来越好。如果您遇到困难或有问题,您可以到许多不同的地方寻求帮助。由于 Node 很受欢迎,因此在 GitHub 上不难找到已有的解决方案和代码。
Node.js 的另一大亮点是其名为npm(Node Package Manager)的软件包管理器。Npm 允许开发人员推送和使用现成的 JavaScript 包,而不是重新发明轮子。这些软件包可以大大降低应用程序的开发成本和复杂性。在撰写本文时,npm 上托管了 130 多万个软件包。
Node.js 的局限性
完成复杂任务的能力下降
Node.js 的最大缺点是无法执行需要大量计算的任务。如今,很多程序和算法都需要并行化才能获得最佳结果。众所周知,Node.js 是基于 JavaScript 设计的,而 JavaScript 是一种单线程前端语言,不支持多线程。
随着 10.5 版本的更新,Node.js 团队推出了工作线程形式的多线程支持。该模块允许开发人员利用线程池中的额外线程。即使有了工作线程,Node 仍然不适合用于繁重的计算。如果您的项目要求包括复杂计算、重型计算或并行化,您最好使用其他编程语言。
异步编程模型
Node.js 使用异步编程模型。因此,它在很大程度上依赖于回调的使用。回调是在后台运行并(在某些时候)返回结果的函数。使用回调后,代码会变得更加混乱,调试起来也更加困难。此外,如果将回调嵌套到多个层级,可能会出现所谓的“回调地狱”。
只要遵循简洁的代码原则,就能轻松避免回调地狱和异步编程的其他问题。
不稳定的应用程序接口
Node.js 的另一个大问题是其应用程序编程接口 (API) 的不稳定性。Node 的 API 经常发生向后不兼容的变化,可能会破坏代码。因此,Node 开发人员需要密切关注变化,确保他们的代码库与最新的 Node.js API 版本兼容。
缺乏强大的图书馆支持系统
与其他编程语言相比,JavaScript 不具备良好的库系统。这就迫使很多开发人员不得不承担各种常见任务的支持工作,如图像处理、XML 解析、对象关系映射(ORM)、数据库处理等。
杂草丛生、不成熟的模块注册表
Node 拥有一个庞大的开发者社区,他们开发了成千上万的开源模块,并发布在 npm 上。这样做的问题在于,npm 并没有实施任何检查,以确保模块代码能够正常工作,并且是精心编写的。
很多模块在更新的 Node 版本中突然变得不支持或失效,开发人员不得不寻找替代品。过去,一些 npm 模块还被黑客植入病毒和加密矿工。因此,很难找到可在企业环境中使用的模块。
别误会我的意思,我认为 npm 非常棒,但在安装随机模块时仍需谨慎。
Node.js 部署选项
部署 Node.js 应用程序有多种方法。一般来说,我们可以将它们分为以下四组:
- 传统托管
- 基础设施即服务(IaaS)
- 平台即服务(PaaS)
- 后台即服务(BaaS)
我们可以根据它们的抽象程度,用金字塔图来显示它们:
部署选项负责以下抽象层:
让我们来看看每一组的情况。我们将跳过传统的主机托管,因为我相信你知道它是如何工作的。
IaaS 服务,如 AWS
基础设施即服务(IaaS)是一种云计算服务模式,在虚拟化环境中提供服务器、网络、操作系统和存储等计算资源。这些云服务器通常通过高级应用程序接口(API)或高级仪表板提供给企业,让客户完全控制整个基础设施。
IaaS 具有高度可扩展性。它使客户能够根据需求轻松地进行纵向和横向扩展。IaaS 供应商通常采用 “即用即付 “模式,这意味着您只需为所消耗的资源付费。
IaaS 出现于 2010 年代初,此后成为许多类型工作负载的标准抽象模型。即使随着微服务和无服务器等新技术的兴起,IaaS 仍然是最受欢迎的选择。
与 PaaS 和 BaaS 相比,IaaS 提供了对云中资源的最低级别控制。这使其成为最灵活的云计算模式。它的缺点是,客户要完全负责管理应用程序、操作系统、中间件和数据等方面,这通常需要花费大量时间。
一些典型的 IaaS 例子包括
- 亚马逊网络服务(AWS)
- 谷歌计算引擎(GCE)
- 微软 Azure
- 数字海洋
- Linode
- Rackspace
PaaS 服务,如 Heroku
平台即服务(PaaS)是一种云计算服务模式,它为用户提供一个可以开发、管理和交付应用程序的云环境。除了提供计算机资源外,PaaS 还提供大量用于开发、定制和测试应用程序的预置工具。大多数 PaaS 供应商都允许您只需点击几下即可启动并运行应用程序!
PaaS 使用户能够专注于自己的应用程序,而不是管理底层基础设施。PaaS 提供商会为你做很多繁重的工作,如管理服务器、操作系统、服务器软件、备份等。
PaaS 的一些优势包括
- 更快的上市速度
- 加强安全
- 成本效益
- 可扩展性
- 高可用性
- 所需代码更少
PaaS 的缺点是,你很可能要依赖供应商的能力,有被锁定的风险,而且缺乏灵活性和控制力。不过,PaaS 仍能让用户更快地构建应用程序,并减轻管理负担。
PaaS 服务包括
- Heroku
- AWS Elastic Beanstalk
- DigitalOcean 应用程序平台
- 微软 Azure 应用服务
- 飞行平台(Fly.io)
- 渲染
BaaS服务,如Back4app
后端即服务(BaaS)是一个平台,可自动完成开发的后端工作,并负责云基础设施。除此之外,它还提供用户管理、电子邮件通知、推送通知、云代码功能、社交媒体集成、文件存储和支付等功能。
这样,开发人员就可以专注于核心业务和前端开发,而不必担心底层后台和基础设施。前端通常是通过 BaaS 供应商提供的专门 API 和 SDK 开发的。这就降低了应用程序的复杂性,使其更易于维护。
BaaS 提供了 IaaS 和 PaaS 的所有优势,同时还包括对后台的抽象。利用 BaaS 的团队可以大大缩短产品上市时间,降低工程成本,并减少所需的工程师人数。
BaaS 可用于多种类型的项目,包括制作 MVP(最小可行产品)、独立应用程序或需要少量集成的应用程序以及非关键任务的企业应用程序。
BaaS 的缺点是灵活性不如 IaaS 和 PaaS,可控性和定制化程度较低,而且有可能被非开源平台锁定。
几个 BaaS 例子
- Back4app
- AWS 放大
- Firebase
- 解析
- 云套件
- 无背
Node.js 部署流程
在这部分文章中,我们将了解 Back4app 并学习如何构建和部署 Node JS 应用程序
什么是 Back4app?
Back4app是市场上 最好的开源后端即服务(BaaS)解决方案之一。它为用户提供了广泛的功能和优势,允许开发人员快速构建网络和移动应用程序。使用 Back4app,您就可以专注于核心业务,而不必担心后台或底层基础设施。
该解决方案具有功能丰富、易于使用的仪表板和命令行界面(CLI)。他们还为您喜爱的所有工具提供 SDK,如 Flutter、React Native、Node.js、Angular、Android、iOS 等!
Back4app 的主要功能包括
- 类似电子表格的数据库
- REST 和 GraphQL 应用程序接口
- 实时查询
- 身份验证(包括社交身份验证)
- 可扩展托管
- 推送和电子邮件通知
有关其功能的更多信息,请查看Back4app 功能。
Back4app 采用简单明了的价格模式,适合任何规模的应用程序。他们提供慷慨的免费计划(无需信用卡),非常适合原型设计和平台测试。它包括
- 25k 申请
- 250 MB 数据存储空间
- 1 GB 传输
- 1 GB 文件存储空间
有关 Back4app 定价的更多信息,请访问定价页面。
项目介绍
我们将编写并部署一个简单的 TODO 网络应用程序。该网络应用程序将支持基本的 CRUD 操作 — 创建、检索、更新和删除。我们将使用 Express 网络框架在 Node.js 中进行编码,数据存储将由 Parse 处理,我们将使用 Twig 作为模板引擎。
先决条件
- 基本了解 Node.js
- 对快递的基本了解
- 使用模板引擎的经验
- 对数据库和 ParseJS 有基本了解
Back4app CLI
Back4app CLI 是一个命令行界面,允许您与 Back4app 平台进行交互。
要在 Mac/Linux 上安装,请运行
$ curl https://raw.githubusercontent.com/back4app/parse-cli/back4app/installer.sh | sudo /bin/bash
该命令将下载最新的 CLI 二进制文件,并将其存储在/usr/local/bin/b4a 中。
其他操作系统请参考官方文档。
要使用 CLI,您必须使用账户进行身份验证。为此,您首先需要生成一个账户密钥。进入 Back4app 面板,点击用户名(屏幕右上方),然后点击 “账户密钥”:
要添加新账户密钥,请输入自定义密钥名称,然后按 “+”。记下密钥,因为下一步我们会用到它:
成功创建密钥后,返回终端并运行:
$ b4a configure accountkey
Input your account key or press ENTER to generate a new one.
NOTE: on pressing ENTER we'll try to open the url:
"http://dashboard.back4app.com/classic#/wizard/account-key"
in default browser.
Account Key: <YOUR_GENERATED_ACCOUNT_KEY>
Successfully stored account key for: "<YOUR_EMAIL>".
为确保验证成功,请尝试列出您的应用程序:
$ b4a list
These are the apps you currently have access to:
如果您的账户像我的账户一样是全新的,则不会列出任何应用程序。
创建应用程序
接下来,让我们创建一个 Back4app 应用程序。
运行:
$ b4a new
Would you like to create a new app, or add Cloud Code to an existing app?
Type "(n)ew" or "(e)xisting": n
Please choose a name for your Parse app.
Note that this name will appear on the Back4App website,
but it does not have to be the same as your mobile app's public name.
Name: nodejs-back4app
Awesome! Now it's time to set up some Cloud Code for the app: "nodejs-back4app",
Next we will create a directory to hold your Cloud Code.
Please enter the name to use for this directory,
or hit ENTER to use "nodejs-back4app" as the directory name.
Directory Name:
You can either set up a blank project or create a sample Cloud Code project
Please type "(b)lank" if you wish to setup a blank project, otherwise press ENTER:
Successfully configured email for current project to: "<YOUR_EMAIL>"
Your Cloud Code has been created at /dev/nodejs-back4app.
- 创建新应用程序或现有应用程序:新
- 选择应用程序名称:选择自定义名称
- 目录名称:按 ENTER 键
- 空白或示例云代码项目:按 ENTER 键
该命令将创建一个结构如下的目录:
nodejs-back4app/
├── cloud/
│ └── main.js
├── public/
│ └── index.html
├── .parse.local
└── .parse.project
- cloud是所有云代码和功能的目录
- public是公共文件目录,如图像、样式表等。
- .parse.local和.parse.project用于存储 Parse 配置。
删除main.js和index.html文件,因为我们不需要它们。
网络托管
由于我们创建的是 Node.js 应用程序,因此需要为 Back4app 启用虚拟主机,以托管我们的应用程序,并使其可在互联网上公开访问。
要启用虚拟主机功能,请访问 Back4app 面板,选择您的应用程序,点击屏幕左侧的 “应用程序设置”,然后点击 “服务器设置”。搜索 “虚拟主机和自定义域名”,再次点击 “设置”。
点击 “激活 Back4app 托管”,然后选择一个子域名。我将使用nodejsback4app
:
最后,点击 “保存”。
然后,您就可以在以下地址访问您的应用程序:
https://<your_subdomain>.b4a.app/
您也可以将自定义域名链接到网络应用程序!
使用云代码功能进行表达
接下来,让我们开始编写实际代码。
将目录更改为云,并在其中创建package.json文件:
Back4app 使用此文件通过 npm 下载模块。我们添加了body-parser
,因为稍后需要它来解析请求。
接下来,在云文件夹中创建另一个名为app.js 的文件:
该文件用于初始化和配置 Express。我们还定义了一个端点,它将在下一步中用作正确性检查。正如你所看到的,我们不需要定义应用程序
,也不需要任何依赖关系,因为 Back4app 会自动帮我们完成这些工作。
接下来,部署应用程序:
$ b4a deploy
Uploading source files
Uploading recent changes to scripts...
Finished uploading files
New release is named v1 (using Parse JavaScript SDK v2.2.25)
该命令将把源文件上传到 Back4app,配置所有内容,并在上一节选择的子域中提供应用程序。
要确保它能正常工作,请打开您最喜欢的网络浏览器并导航到您的应用程序:
https://<your_subdomain>.b4a.app/
# Example
https://nodejsback4app.b4a.app/
您将收到以下回复:
干得好
在接下来的章节中,我们将开始制作实际的 TODO 应用程序。
使用 ParseJS 创建数据库
让我们为 TODO 应用程序定义数据库模型。
导航至 Back4app 面板,选择屏幕左侧的 “数据库”。然后点击 “创建一个新类”,将其命名为 “任务
“,并确保勾选 “已启用公共读写”:
接下来,添加以下列:
+-----------+-------------+---------------+----------+
| Data type | Name | Default value | Required |
+-----------+-------------+---------------+----------+
| String | name | <leave blank> | yes |
+-----------+-------------+---------------+----------+
| String | description | <leave blank> | no |
+-----------+-------------+---------------+----------+
| Boolean | isDone | false | yes |
+-----------+-------------+---------------+----------+
应用程序逻辑
该应用程序将有以下端点:
- / 显示任务列表
/create
创建任务/<ID>
显示任务详情/<ID>/delete
删除任务/<ID>/toggle 切换
任务状态 — 已完成/未完成
让我们来创造它们。
为了使我们的云代码更易于维护,我们将把它分成两个文件。
- app.js— 初始化和配置 Express 服务器
- routes.js— 定义端点及其逻辑
构建现代网络应用程序的更好方法是使用模型-视图-控制器(MVC)架构模式。使用 Express 的一个良好开端是使用express-generator。
用以下内容替换app.js内容:
- 我们将 Twig 设置为默认视图引擎。
- 路由不再在此文件中定义,而是在routes.js 中定义。
接下来,创建routes.js,并输入以下代码:
我们定义了上述所有路由,并使用 Parse 来操作和存储数据。正如你所看到的,所有路由都是异步的
,因为我们必须等待 Parse 响应。此外,大部分代码都封装在try-catch
块中,以防出错。
有关 ParseJS 的其他信息,请参阅JavaScript 指南。
接下来,让我们为端点配上视图模板。
在云文件夹中创建视图文件夹,从GitHub repo下载模板文件并将其放入视图目录。
最终的目录结构应如下所示:
nodejs-back4app/
├── cloud/
│ ├── views/
│ │ ├── base.twig
│ │ ├── create.twig
│ │ ├── error.twig
│ │ ├── index.twig
│ │ └── task.twig
│ ├── app.js
│ ├── routes.js
│ └── package.json
├── public
├── parse.local
└── parse.project
最后,在package.json中添加twing
以启用 Twig 支持:
部署应用程序
$ b4a deploy
Uploading source files
Uploading recent changes to scripts...
Finished uploading files
New release is named v2 (using Parse JavaScript SDK v2.2.25)
然后就大功告成了。等待几分钟,然后访问网络应用程序,确保一切正常。
公共档案
如上一节所述,Back4app 会自动提供公共文件夹中的文件。要在模板中使用这些文件,您必须稍微修改一下 Express 设置。
转到app.js,添加以下几行:
这样,您就可以通过相对路径在模板中引用公共文件:
<img src="/back4app.png" alt="Back4app Logo">
显示位于public/back4app.png 中的图片。
结论
自 2009 年发布以来,Node 一直在稳步发展和改进。它是允许开发人员轻松构建可扩展高性能应用程序的最佳工具之一。
Node 应用程序可以部署在不同的解决方案上,如 IaaS、PaaS 和 SaaS。它们各有优缺点,在选择部署方案时应加以考虑。
部署 Node 应用程序最简单的方法之一就是使用 Back4app — 一种具有丰富功能的开源 BaaS 解决方案。Back4app 的优势在于,它可以让您专注于重要的事情,同时外包后台及其部署。
从back4app-nodejs repo 获取最终源代码。
要了解有关 Node.js 托管选项的更多信息,请参阅如何使用容器托管 Node.JS 应用程序。