4. 部署 Apollo Server
6m

🚀 部署我们的服务器

让我们使用 Railway 让我们的在生产中启动并运行!

Railway是一个云服务平台,使我们能够部署我们的应用而不必担心具体的基础设施。本教程使用 Railway,因为它可以同步到 GitHub 存储库,且它有一个免费层,使我们能够在没有信用卡的情况下运行我们的应用!

我们可以单击主页上的 登录来开始使用 Railway。您可以选择使用您的电子邮件登录,或直接使用您的 GitHub 帐户登录。我们将使用我们的 GitHub 帐户进行身份验证,并为自己节省一些额外的步骤。

您可能还需要完成验证步骤,以便 Railway 能够访问您的帐户。

在仪表盘中,让我们单击 新建项目

Railway dashboard with the New Project button highlighted on the top right

然后选择 从 GitHub 存储库部署

接下来,我们将选择 配置 GitHub 应用,然后按照 GitHub 上的说明对 Railway 进行授权。现在我们可以访问我们的存储库了!

Railway dashboard showing GitHub repositories

让我们选择我们已分叉的仓库。但在部署之前,我们需要设置一些环境变量。

🌲 添加环境变量

让我们点击 添加变量

Railway project with Add Variables button highlighted

我们将使用 原始编辑器 同时处理这些

Railway project with Raw Editor button text highlighted

这将打开一个模态窗口,我们可以在其中粘贴我们所有便捷的

Railway project with Raw Editor modal open

还记得在创建 时 Studio 为我们提供的环境变量吗?让我们将它们派上用场!

回到 Studio 中,我们将复制 的所有三个 。确保切换图标的眼睛以查看 APOLLO_KEY ,之后再复制 - 毕竟,我们需要真实的值!

让我们跳回到 Railway 并将那些 粘贴到 ENV 面板中。然后,单击 更新变量

现在,如果我们跳回到 部署 标签页,我们将看到 Railway 触发了我们应用程序的新部署。只需片刻,我们应该就能看到它起作用了!

接下来,我们希望在互联网上的公共 URL 上 我们的服务器。为此,我们需要生成一个域名。前往你的应用 设置 标签页,然后单击域名标题下方的 生成域名 按钮。

Railway project, under Settings tab, click Generate Domain

这将自动创建一个生产 URL,我们将在稍后的客户端应用中使用它。

让我们点击生成的 URL,咦?

Production URL with PORT error

我们需要对我们的代码进行一个更改。Railway 需要我们的服务器在由幕后设置的 PORT 环境变量指定的一个端口上运行。

🔌 设置 PORT

让我们打开 server 代码库。在 src 文件夹中,打开 index.js 文件。

现在,默认情况下, 在端口 4000 上侦听。我们需要通过在 listen 方法中指定 options 对象来更新它。

await server.listen({ port: process.env.PORT || 4000 });

port 属性设置为 process.env.PORT(其中 PORT 全部大写)。为了确保我们的服务器仍可在我们自己的机器上本地工作,我们将添加一个“或”(||)并指定 4000 作为我们的端口号。

就是这样!让我们务必添加并提交这些更改,并将它们推送到我们的 GitHub 代码库。

任务!
代码挑战!

编辑以下代码,以配置 Apollo Server 侦听由 process.env.PORT 指定的端口,如果不存在,则侦听硬编码端口号 4000

回到 Railway,我们应该看到新的提交触发另一次部署。

让我们再试一次。返回生成的 URL,我们看到了 在生产环境中的着陆页!太棒了! 🎉🎉

Apollo Server landing page in production

但这个页面看起来与我们在本地运行服务器时通常看到的页面稍有不同。

我们无法通过 查询我们的服务器NODE_ENV 环境变量自动设置为 production, 这会提醒我们的 也将其本身切换为生产, 并自动禁用

🤔 什么是 GraphQL 内省?

的一项功能,它使我们能够 一个 以获取有关底层模式的信息。这包括类型、和字段级别的描述等数据。类似 这样的工具使用内省来构建和运行查询。

Illustration of introspection in development environments

问题在于在生产中拥有 可能是一个重大的安全问题。它向全世界展示了所有 的结构以及我们可以对其做什么。在大多数情况下,这不是我们想要的!这就是为什么 在生产环境中默认禁用

Illustration of introspection in production environments, where introspection is turned off
我们可以通过内省功能从 GraphQL 服务器中查询哪些信息?
关于 introspection 特性,以下哪些说法是正确的?

如果我们不能使用依赖的工具来我们的服务器,该如何对其进行测试?嗯,感谢架构注册表,我们现在有了安全的方式来访问我们的,并使用 Apollo Explorer 其上运行查询。

通过 Explorer 进行查询

让我们导航到 Explorer 中来测试tracksForHome

query GetTracks {
tracksForHome {
id
title
thumbnail
length
modulesCount
author {
name
photo
}
}
}

您首次尝试运行时,Explorer 会提示您输入生产服务器的 URL。这是我们在 Railway 中生成的域名 URL。

http://studio.apollographql.com
Apollo Studio Connection Settings in Explorer

我们发现,tracksForHome 仍然有效!

任务!

太棒了,我们的服务器在生产环境中运行起来了! 🎉接下来,让我们来处理客户端应用。

上一节

分享您对本课程的疑问和评论

您的反馈有助于我们进行改进!如果您遇到了难题或感到困惑,请告诉我们,我们会为您提供帮助。所有评论均为公开的,必须遵守 Apollo 行为准则。请注意,已解决或得到处理的评论可能会被删除。

在下方发帖,您需要一个 GitHub 帐户。没有帐户? 改在我们的 Odyssey 论坛发帖。