Express 教程第七部分:部署到生产环境

既然你已经使用 Express 创建并测试了一个示例网站,现在是时候将其部署到 Web 服务器,以便人们可以通过公共互联网访问它。本页解释了如何托管 Express 项目,并概述了为生产环境做好准备所需的内容。

预备知识 完成所有之前的教程主题,包括Express 教程第六部分:使用表单
目标 了解在何处以及如何将 Express 应用程序部署到生产环境。

概述

一旦你的网站完成(或“足够”完成以开始公开测试),你就需要将其托管在一个比你的个人开发计算机更公共、更容易访问的地方。

到目前为止,你一直在开发环境中工作,使用 Express/Node 作为 Web 服务器将你的网站共享到本地浏览器/网络,并使用(不安全)的开发设置运行你的网站,这些设置会暴露调试和其他私密信息。在外部托管网站之前,你首先需要:

  • 选择一个用于托管 Express 应用程序的环境。
  • 对你的项目设置进行一些更改。
  • 为你的网站建立生产级别的基础设施。

本教程提供了选择托管站点的指南、准备 Express 应用程序进行生产的简要概述,以及在 Railway 云托管服务上安装 LocalLibrary 网站的实际示例。

什么是生产环境?

生产环境是服务器计算机提供的环境,你将在其中运行你的网站供外部使用。该环境包括:

  • 运行网站的计算机硬件。
  • 操作系统(例如,Linux 或 Windows)。
  • 你的网站所基于的编程语言运行时和框架库。
  • Web 服务器基础设施,可能包括 Web 服务器、反向代理、负载均衡器等。
  • 你的网站所依赖的数据库。

服务器计算机可以位于你的场所并通过快速链接连接到互联网,但更常见的是使用托管在“云端”的计算机。这实际上意味着你的代码运行在托管公司数据中心中的某个远程计算机(或可能是“虚拟”计算机)上。远程服务器通常会以一定的价格提供一定级别的计算资源(例如,CPU、RAM、存储内存等)和互联网连接。

这种远程可访问的计算/网络硬件被称为 基础设施即服务 (IaaS)。许多 IaaS 供应商提供预安装特定操作系统的选项,你必须在其上安装生产环境的其他组件。其他供应商允许你选择功能更完整的环境,可能包括完整的 Node 设置。

注意:预构建的环境可以简化你的网站设置,因为它们减少了所需的配置,但可用的选项可能会将你限制在不熟悉的服务器(或其他组件)上,并且可能基于较旧的操作系统版本。通常,最好自己安装组件,这样你就可以获得想要的组件,并且当需要升级系统部件时,你对从何开始有一些了解!

其他托管服务提供商支持 Express 作为 平台即服务 (PaaS) 产品的一部分。使用这种托管方式时,你无需担心大部分生产环境(服务器、负载均衡器等),因为主机平台会为你处理这些。这使得部署非常简单,因为你只需专注于你的 Web 应用程序,而无需关注任何其他服务器基础设施。

一些开发人员会选择 IaaS 提供的更大灵活性,而不是 PaaS,而另一些开发人员则会欣赏 PaaS 减少的维护开销和扩展工作。当你刚开始时,在 PaaS 系统上设置你的网站要容易得多,所以这就是我们将在本教程中做的。

注意:如果你选择一个对 Node/Express 友好的托管服务提供商,他们应该提供关于如何使用不同配置的 Web 服务器、应用程序服务器、反向代理等设置 Express 网站的说明。例如,在 DigitalOcean Node 社区文档中,有许多针对各种配置的逐步指南。

选择托管服务提供商

有许多托管服务提供商已知要么积极支持要么与 Node(和 Express)配合良好。这些供应商提供不同类型的环境 (IaaS, PaaS),以及不同级别和价格的计算和网络资源。

注意:托管解决方案有很多,它们的服务和定价可能会随时间变化。虽然我们在下面介绍了一些选项,但在选择托管服务提供商之前,值得检查这些选项以及其他选项。

选择主机时需要考虑的一些事项:

  • 你的网站可能有多繁忙,以及满足该需求所需的数据和计算资源的成本。
  • 水平扩展(添加更多机器)和垂直扩展(升级到更强大的机器)的支持级别以及这样做的成本。
  • 供应商拥有数据中心的地理位置,以及因此访问速度可能最快的地方。
  • 主机的历史正常运行时间 (uptime) 和停机时间 (downtime) 性能。
  • 提供的网站管理工具——它们是否易于使用且安全(例如,SFTP 与 FTP)。
  • 内置的服务器监控框架。
  • 已知限制。一些主机将故意阻止某些服务(例如,电子邮件)。其他主机只在某些价格层级提供一定小时数的“实时运行时间”,或只提供少量存储空间。
  • 额外的好处。一些提供商将提供免费域名和对 TLS 证书的支持,否则你将不得不为此付费。
  • 你所依赖的“免费”层级是否会随时间到期,以及迁移到更昂贵的层级的成本是否意味着你最初使用其他服务会更好!

当你刚开始时,好消息是,有相当多的网站提供用于评估和测试的“免费”计算环境。这些通常是资源相当受限的环境,你需要注意它们可能会在介绍期后过期或有其他限制。然而,它们非常适合在托管环境中测试低流量网站,并且当你的网站变得更繁忙时,可以轻松迁移到支付更多资源。这类流行的选择包括 Amazon Web ServicesMicrosoft Azure

大多数提供商还提供“基本”或“业余”层级,旨在用于小型生产网站,并提供更有用的计算能力和更少的限制。RailwayHerokuDigitalOcean 是流行托管提供商的示例,它们具有相对便宜的基本计算层级(每月 5 到 10 美元左右)。

注意:请记住,价格不是唯一的选择标准。如果你的网站成功,可扩展性可能才是最重要的考虑因素。

让你的网站准备好发布

发布网站时要考虑的主要事项是网络安全和性能。最起码,你需要修改数据库配置,以便在生产环境中使用不同的数据库并保护其凭据,删除开发期间错误页面中包含的堆栈跟踪,整理日志,并设置适当的标头以避免许多常见的安全威胁。

在以下小节中,我们概述了你应该对应用程序进行的最重要的更改。

注意:Express 文档中还有其他有用的提示——请参阅 生产最佳实践:性能和可靠性生产最佳实践:安全性

数据库配置

到目前为止,在本教程中,我们使用了一个单一的开发数据库,其地址和凭据被硬编码到 bin/www。由于开发数据库不包含我们介意暴露或损坏的任何信息,因此泄露这些详细信息没有特别的风险。但是,如果你正在处理真实数据,尤其是个人用户信息,那么保护你的数据库凭据就非常重要。

因此,我们希望为生产环境使用与开发环境不同的数据库,并且将生产数据库凭据与源代码分开,以便可以对其进行适当的保护。

如果你的托管服务提供商支持通过 Web 界面设置环境变量(许多提供商都支持),一种方法是让服务器从环境变量获取数据库 URL。下面我们修改 LocalLibrary 网站,如果已定义,则从 OS 环境变量获取数据库 URI,否则使用开发数据库 URL。

打开 bin.www 并找到设置 MongoDB 连接变量的行。它看起来像这样:

js
const mongoDB =
  "mongodb+srv://your_user_name:your_password@cluster0.cojoign.mongodb.net/local_library?retryWrites=true&w=majority";

将该行替换为以下代码,该代码使用 process.env.MONGODB_URI 从名为 MONGODB_URI 的环境变量获取连接字符串(如果已设置)(使用你自己的数据库 URL 替换下面的占位符)。

js
const dev_db_url =
  "mongodb+srv://your_user_name:your_password@cluster0.cojoign.mongodb.net/local_library?retryWrites=true&w=majority";
const mongoDB = process.env.MONGODB_URI || dev_db_url;

注意:将生产数据库凭据与源代码分开的另一种常见方法是从单独部署到文件系统的 .env 文件中读取它们(例如,它们可能使用 npm 的 dotenv 模块读取)。

将 NODE_ENV 设置为 'production'

我们可以通过将 NODE_ENV 环境变量设置为 *production* 来删除错误页面中的堆栈跟踪(默认设置为 'development')。除了生成不那么冗长的错误消息外,将变量设置为 *production* 还会缓存视图模板和从 CSS 扩展生成的 CSS 文件。测试表明,将 NODE_ENV 设置为 *production* 可以将应用程序性能提高三倍!

此更改可以通过使用 export、环境文件或操作系统初始化系统进行。

注意:这实际上是你在环境设置而不是应用程序中进行的更改,但此处值得注意!我们将在下面的托管示例中展示如何进行此设置。

适当记录

日志调用可能会对高流量网站产生影响。在生产环境中,你可能需要记录网站活动(例如,跟踪流量或记录 API 调用),但你应该尝试最小化为调试目的添加的日志量。

在生产环境中最小化“调试”日志记录的一种方法是使用像 debug 这样的模块,它允许你通过设置环境变量来控制执行的日志记录。例如,下面的代码片段显示了你如何设置“author”日志记录。debug 变量声明为“author”,并且所有来自此对象的日志都将自动显示前缀“author”。

js
const debug = require("debug")("author");

// Display Author update form on GET.
exports.author_update_get = async (req, res, next) => {
  const author = await Author.findById(req.params.id).exec();
  if (author === null) {
    // No results.
    debug(`id not found on update: ${req.params.id}`);
    const err = new Error("Author not found");
    err.status = 404;
    return next(err);
  }

  res.render("author_form", { title: "Update Author", author });
};

然后,你可以通过在 DEBUG 环境变量中将其指定为逗号分隔列表来启用一组特定的日志。你可以设置用于显示作者和书籍日志的变量,如下所示(也支持通配符)。

bash
#Windows
set DEBUG=author,book

#Linux
export DEBUG="author,book"

注意:debug 的调用可以替换你以前使用 console.log()console.error() 进行的日志记录。将代码中所有 console.log() 调用替换为通过 debug 模块进行的日志记录。通过设置 DEBUG 变量在开发环境中打开和关闭日志记录,并观察这对日志记录的影响。

如果你需要记录网站活动,可以使用 WinstonBunyan 等日志库。有关此主题的更多信息,请参阅:生产最佳实践:性能和可靠性

对响应使用 gzip/deflate 压缩

Web 服务器通常可以压缩发送回客户端的 HTTP 响应,从而显著减少客户端获取和加载页面所需的时间。使用的压缩方法将取决于客户端在请求中声称支持的解压缩方法(如果不支持任何压缩方法,响应将未压缩发送)。

使用 compression 中间件将此功能添加到你的网站。通过运行以下命令在项目根目录安装此中间件:

bash
npm install compression

打开 ./app.js 并按所示要求压缩库。使用 use() 方法将压缩库添加到中间件链中(这应该出现在任何你想压缩的路由之前——在这种情况下,是所有路由!)

js
const catalogRouter = require("./routes/catalog"); // Import routes for "catalog" area of site
const compression = require("compression");

// Create the Express application object
const app = express();

// …

app.use(compression()); // Compress all routes

app.use(express.static(path.join(__dirname, "public")));

app.use("/", indexRouter);
app.use("/users", usersRouter);
app.use("/catalog", catalogRouter); // Add catalog routes to middleware chain.

// …

注意:对于生产中的高流量网站,你不会使用此中间件。相反,你会使用像 Nginx 这样的反向代理。

使用 Helmet 防御已知漏洞

Helmet 是一个中间件包。它可以设置适当的 HTTP 标头,帮助保护你的应用程序免受已知 Web 漏洞的侵害(有关它设置的标头和防御的漏洞的更多信息,请参阅文档)。

通过运行以下命令在项目根目录安装此中间件:

bash
npm install helmet

打开 ./app.js 并按所示要求 helmet 库。然后使用 use() 方法将模块添加到中间件链中。

js
const compression = require("compression");
const helmet = require("helmet");

// Create the Express application object
const app = express();

// Add helmet to the middleware chain.
// Set CSP headers to allow our Bootstrap and jQuery to be served
app.use(
  helmet.contentSecurityPolicy({
    directives: {
      "script-src": ["'self'", "cdn.jsdelivr.net"],
    },
  }),
);

// …

我们通常可能只插入 app.use(helmet()); 来添加对大多数网站有意义的安全相关标头子集。然而,在 LocalLibrary 基本模板中,我们包含了一些引导脚本。这些脚本违反了 Helmet 的默认 内容安全策略 (CSP),该策略不允许加载跨站脚本。为了允许加载这些脚本,我们修改了 Helmet 配置,使其设置 CSP 指令以允许从指定域加载脚本。对于你自己的服务器,你可以根据需要添加/禁用特定标头,方法是遵循此处使用 Helmet 的说明

向 API 路由添加速率限制

Express-rate-limit 是一个中间件包,可用于限制对 API 和端点的重复请求。过度请求你的网站的原因有很多,例如拒绝服务攻击、暴力破解攻击,甚至是行为不正常的客户端或脚本。除了由于请求过多导致服务器变慢而可能出现的性能问题外,你还可能因为额外的流量而被收费。此包可用于限制对特定路由或一组路由的请求数量。

通过运行以下命令在项目根目录安装此中间件:

bash
npm install express-rate-limit

打开 ./app.js 并按所示要求 express-rate-limit 库。然后使用 use() 方法将模块添加到中间件链中。

js
const compression = require("compression");
const helmet = require("helmet");
const RateLimit = require("express-rate-limit");

const app = express();

// Set up rate limiter: maximum of twenty requests per minute
const limiter = RateLimit({
  windowMs: 1 * 60 * 1000, // 1 minute
  max: 20,
});
// Apply rate limiter to all requests
app.use(limiter);

// …

以上命令将所有请求限制为每分钟 20 次(你可以根据需要更改)。

注意:如果需要更高级的防御拒绝服务或其他类型的攻击,也可以使用像 Cloudflare 这样的第三方服务。

设置 Node 版本

对于 Node 应用程序,包括 Express,package.json 文件包含了托管服务提供商应需要了解的所有应用程序依赖项和入口文件。

我们当前 package.json 中唯一缺少的重要信息是库所需的 Node 版本。你可以通过输入以下命令找到开发时使用的 Node 版本:

bash
>node --version
v16.17.1

打开 package.json,并按所示将此信息添加为 engines > node(使用你系统的版本号)。

json
{
  "engines": {
    "node": ">=22.0.0"
  }
}

托管服务可能不支持指定的特定 Node 版本,但此更改应确保它尝试使用相同主要版本号或更新版本的版本。

请注意,在不同的托管服务上可能还有其他指定 Node 版本的方法,但 package.json 方法得到了广泛支持。

获取依赖项并重新测试

在我们继续之前,让我们再次测试网站,确保它没有受到我们任何更改的影响。

首先,我们需要获取我们的依赖项。你可以在项目根目录的终端中运行以下命令来完成此操作:

bash
npm install

现在运行网站(请参阅测试路由以获取相关命令)并检查网站行为是否仍符合你的预期。

在 GitHub 中创建应用程序仓库

许多托管服务允许你从本地仓库或基于云的源代码版本控制平台导入和/或同步项目。这可以使部署和迭代开发变得更加容易。

在本教程中,我们将为库设置一个 GitHub 帐户和仓库,并使用 git 工具上传我们的源代码。

注意:如果你已经使用 GitHub 管理你的源代码,则可以跳过此步骤!

请注意,使用源代码管理工具是良好的软件开发实践,因为它允许你尝试更改,并在需要时在你的实验和“已知良好代码”之间切换!

步骤如下:

  1. 访问 https://github.com/ 并创建一个帐户。

  2. 登录后,单击顶部工具栏中的 + 链接,然后选择 New repository

  3. 填写此表单中的所有字段。虽然这些不是强制性的,但强烈建议填写。

    • 输入新的仓库名称(例如,express-locallibrary-tutorial)和描述(例如,“用 Express 编写的本地图书馆网站”)。
    • Add .gitignore 选择列表中选择 Node
    • Add license 选择列表中选择你偏好的许可证。
    • 勾选 Initialize this repository with a README

    警告:默认的“公共”访问将使所有源代码——包括你的数据库用户名和密码——对互联网上的任何人可见!请确保源代码从环境变量中读取凭据,并且没有任何硬编码的凭据。

    否则,选择“私有”选项以仅允许选定的人查看源代码。

  4. Create repository

  5. 点击新仓库页面上的绿色 Clone or download 按钮。

  6. 从出现的对话框中的文本字段复制 URL 值。如果你使用仓库名称“express-locallibrary-tutorial”,则 URL 应该类似于:https://github.com/<your_git_user_id>/express-locallibrary-tutorial.git

现在仓库(“repo”)已在 GitHub 上创建,我们将要将其克隆(复制)到本地计算机

  1. 为你的本地计算机安装 git官方 Git 下载指南)。

  2. 打开命令提示符/终端并使用你上面复制的 URL 克隆你的仓库:

    bash
    git clone https://github.com/<your_git_user_id>/express-locallibrary-tutorial.git
    

    这将在当前目录中创建仓库。

  3. 导航到仓库文件夹。

    bash
    cd express-locallibrary-tutorial
    

然后将你的应用程序源文件复制到仓库文件夹中,使用 git 将它们作为仓库的一部分,并将它们上传到 GitHub:

  1. 将你的 Express 应用程序复制到此文件夹中(不包括 /node_modules,其中包含你应该根据需要从 npm 获取的依赖文件)。

  2. 打开命令提示符/终端并使用 add 命令将所有文件添加到 git。

    bash
    git add -A
    
  3. 使用 status 命令检查你即将 commit 的所有文件是否正确(你希望包含源文件,而不是二进制文件、临时文件等)。它应该看起来有点像下面的列表。

    bash
    git status
    
    On branch main
    Your branch is up-to-date with 'origin/main'.
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            new file:   ...
    
  4. 当你满意时,将文件 commit 到你的本地仓库。这相当于签署更改并使其成为本地仓库的官方部分。

    bash
    git commit -m "First version of application moved into GitHub"
    
  5. 此时,远程仓库尚未更改。最后一步是使用以下命令将你的本地仓库同步 (push) 到远程 GitHub 仓库:

    bash
    git push origin main
    

当此操作完成时,你应该能够返回到你在 GitHub 上创建仓库的页面,刷新页面,然后看到你的整个应用程序已上传。你可以使用这种添加/提交/推送循环在文件更改时继续更新你的仓库。

这是备份你的“原始”项目的好时机——虽然我们将在以下部分中进行的一些更改可能对任何托管服务(或用于开发)有用,但其他更改可能不适用。你可以使用命令行上的 git 来完成此操作:

bash
# Create branch vanilla_deployment from the current branch (main)
git checkout -b vanilla_deployment

# Push the new branch to GitHub
git push origin vanilla_deployment

# Switch back to main
git checkout main

# Make any further changes in a new branch
git pull upstream main # Merge the latest changes from GitHub
git checkout -b my_changes # Create a new branch

注意:Git 非常强大!要了解更多信息,请参阅 学习 Git

示例:在 Railway 上托管

本节提供了如何在 Railway 上安装 LocalLibrary 的实际演示。

注意:MDN 已将此项目从许多不再提供免费层的托管服务迁移。我们已决定使用 Railway 作为当前的托管选项,它有一个廉价的爱好层级。大多数服务都有类似的部署方法,因此以下说明应该能帮助你在你选择的平台上发布你的项目。

为什么选择 Railway?

Railway 是一个有吸引力的托管选项,原因有以下几点:

  • Railway 负责大部分基础设施,因此你无需担心。无需担心服务器、负载均衡器、反向代理等,这使得入门变得容易得多。
  • Railway 专注于开发和部署的开发者体验,这使得学习曲线比许多其他替代方案更快、更平缓。
  • 你使用 Railway 时学到的技能和概念是可转移的。虽然 Railway 有一些出色的新功能,但其他流行的托管服务也使用许多相同的思想和方法。
  • Railway 文档清晰而完整。
  • 它有一个相对便宜的业余层级
  • 该服务似乎非常可靠,如果你最终喜欢它,定价是可预测的,并且扩展你的应用程序非常容易。

你应该花时间确定 Railway 是否适合你自己的网站

Railway 如何工作?

Web 应用程序各自运行在自己独立隔离的虚拟化容器中。为了执行你的应用程序,Railway 需要能够设置适当的环境和依赖项,并且还需要了解它是如何启动的。

Railway 使这变得容易,因为它可以根据“通用约定”的使用自动识别和安装许多不同的 Web 应用程序框架和环境。例如,Railway 识别 Node 应用程序是因为它们有一个 package.json 文件,并且可以从“锁”文件中确定用于构建的包管理器。例如,如果应用程序包含文件 package-lock.json,Railway 知道使用 npm 来安装包,而如果它找到 yarn.lock,它知道使用 yarn。安装所有依赖项后,Railway 将在包文件中查找名为“build”和“start”的脚本,并使用它们来构建和运行代码。

注意:Railway 使用 Nixpacks 来识别用不同编程语言编写的各种 Web 应用程序框架。本教程不需要了解其他任何内容,但你可以在 Nixpacks Node 中找到更多关于部署 Node 应用程序的选项。

应用程序运行后,它可以使用 环境变量中提供的信息进行自我配置。例如,使用数据库的应用程序必须使用变量获取地址。数据库服务本身可以由 Railway 或其他提供商托管。

开发人员通过 Railway 网站以及使用特殊的 命令行界面 (CLI) 工具与 Railway 交互。CLI 允许你将本地 GitHub 仓库与 Railway 项目关联起来,将本地分支的仓库上传到实时站点,检查运行进程的日志,设置和获取配置变量等等。最有用的功能之一是你可以使用 CLI 在与实时项目相同的环境变量下运行本地项目。

这就是将应用程序部署到 Railway 所需的全部概述。接下来,我们将设置一个 Railway 帐户,安装我们的网站和数据库,并试用 Railway 客户端。

获取 Railway 帐户

要开始使用 Railway,你首先需要创建一个帐户:

  • 访问 railway.com 并单击顶部工具栏中的 Login 链接。
  • 在弹出窗口中选择 GitHub 以使用你的 GitHub 凭据登录。
  • 然后你可能需要前往你的电子邮件并验证你的帐户。
  • 然后你将登录到 Railway.com 控制台:https://railway.com/dashboard

从 GitHub 部署到 Railway

接下来,我们将设置 Railway 以从 GitHub 部署我们的库。首先从网站顶部菜单中选择 Dashboard 选项,然后选择 New Project 按钮。

Railway website dashboard showing new project button

Railway 将显示新项目的选项列表,包括从 GitHub 帐户中首次创建的模板部署项目的选项,以及许多数据库。选择 Deploy from GitHub repo

Railway popup showing deployment options with Deploy from GitHub repo option highlighted

显示你在设置期间与 Railway 共享的所有 GitHub 仓库中的项目。选择你的本地库的 GitHub 仓库:<user-name>/express-locallibrary-tutorial

Railway popup showing GitHub repos that can be deployed

通过选择 Deploy Now 确认部署。

Confirmation screen when you can select deployment of project

Railway 然后将加载并部署你的项目,并在部署选项卡上显示进度。当部署成功完成时,你将看到如下屏幕。

Railway dashboard showing Deployments tab for the deployed project

现在选择“设置”选项卡,然后向下滚动到“域”部分,然后按“生成域”按钮。

Railway project settings tab showing button to generate a domain

这将发布网站并将域名取代按钮的位置,如下图所示。

Railway project settings tab showing a link to the local library site

选择域 URL 以打开你的库应用程序。请注意,由于我们没有指定生产数据库,因此本地库将使用你的开发数据打开。

配置并连接 MongoDB 数据库

接下来,我们将创建一个生产 MongoDB 数据库来替代我们的开发数据。我们将把数据库作为 Railway 应用程序项目的一部分创建,尽管你也可以将其创建在自己的独立项目中,或者使用 MongoDB Atlas 数据库作为生产数据,就像你为开发数据库所做的那样。

在 Railway 上,从网站顶部菜单中选择 Dashboard 选项,然后选择你的应用程序项目。在此阶段,它只包含你的应用程序的单个服务(可以选择此服务来设置变量和服务的其他详细信息)。选择 New 按钮,该按钮用于向当前项目添加服务。

Railway project with new service button highlighted

当提示服务类型时,选择 Database

Railway popup showing options for a new service, such as database, GitHub repo, empty service etc

然后选择 Add MongoDB 开始添加数据库。

Railway popup showing different databases that can be selected: Postgres, MySQL, MongoDB and so on

Railway 将在同一项目中配置一个包含空数据库的服务。完成后,你现在将在项目视图中看到应用程序和数据库服务。

Railway project with application and database services

选择 MongoDB 服务以显示有关数据库的信息。打开“变量”选项卡并复制“Mongo_URL”(这是数据库的地址)。

Railway database settings screen showing the URL needed to connect to the database

为了让库应用程序能够访问它,我们需要使用环境变量将其添加到应用程序进程中。首先打开应用程序服务。然后选择“变量”选项卡,然后按“新建变量”按钮。

输入变量名 MONGODB_URI 和你为数据库复制的连接 URL(MONGODB_URI 是我们配置应用程序以读取数据库地址的环境变量的名称)。这看起来会像下面显示的屏幕。

Railway website variables screen while adding the MONGODB_URI variable and address

选择 Add 以添加变量。

Railway 在更新变量时会重新启动你的应用程序。如果你现在检查主页,它应该显示对象计数为零,因为上面的更改意味着我们现在正在使用一个新的(空的)数据库。

其他配置变量

你会记得在前面的部分中,我们需要将 NODE_ENV 设置为 'production' 以提高性能并生成不那么冗长的错误消息。我们可以在设置 MONGODB_URI 变量的同一屏幕中完成此操作。

打开应用程序服务。然后选择“变量”选项卡,在那里你会看到 MONGODB_URI 已经定义,然后按“新建变量”按钮。

Railway variables tab with the New Variable button highlighted

输入 NODE_ENV 作为新变量的名称,并输入 production 作为环境的名称。然后按 Add 按钮。

Railway variables tab with new NODE_ENV variable being set to 'production'

本地图书馆应用程序现在已设置并配置为生产用途。你可以通过网站界面添加数据,它应该以与开发期间相同的方式工作(尽管对于无效页面暴露的调试信息更少)。

注意:如果你只想添加一些数据进行测试,你可能会使用 populatedb 脚本(以及你的 MongoDB 生产数据库 URL),如Express 教程第三部分:使用数据库(与 Mongoose)测试 — 创建一些项目中所述。

安装客户端

按照此处的说明下载并为你的本地操作系统安装 Railway 客户端。

安装客户端后,你将能够运行命令。一些更重要的操作包括将计算机的当前目录部署到关联的 Railway 项目(无需上传到 GitHub),以及使用与生产服务器相同的设置在本地运行你的项目。

你可以在终端中输入以下命令获取所有可能命令的列表。

bash
railway help

调试

Railway 客户端提供了 logs 命令来显示日志的尾部(每个项目的更完整日志可在网站上获取)

bash
railway logs

总结

关于在生产环境中设置 Express 应用程序的本教程到此结束,也是关于使用 Express 的系列教程的结束。希望你觉得它们有用。你可以在 GitHub 上查看完整的源代码

另见