🛠 后端第一步
在后端,我们的第一个目标是创建一个GraphQL 服务器能够:
- 接收来自GraphQL 查询我们的客户端
- 验证查询针对我们新创建的模式
- 使用模拟数据填充查询模式字段
- 返回填充的字段作为响应
Apollo Server库帮助我们快速、轻松地实现此服务器,并采用面向生产的方式。
注意:在本课程中,我们使用Apollo Server 3。如果您需要参考 Apollo 文档在学习课程时,请确保您使用的是 v3 文档集!
在server/src/
文件夹,打开 index.js
。
要创建服务器,我们将使用前面安装的 apollo-server
包。在此包中,我们只需要命名的导出 ApolloServer
,因此我们将用大括号声明该常量。就在下面,我们将从 schema.js
文件中导入我们的 typeDefs
:
const { ApolloServer } = require("apollo-server");const typeDefs = require("./schema");
接下来,我们将创建 ApolloServer
类的实例,并将其 typeDefs
传递到其选项对象中:
const server = new ApolloServer({ typeDefs });
注意:我们使用暗示键的简写属性表示法,因为我们已使用匹配键(typeDefs
)为我们的常量命名。
最后,要启动它,我们将调用异步 listen
方法。当它解析时,它会记录一条漂亮的小消息,让我们知道我们的服务器确实已启动并正在运行:
server.listen().then(() => {console.log(`🚀 Server is running!🔉 Listening on port 4000📭 Query at https://127.0.0.1:4000`);});
保存更改。从终端,我们将使用 启动我们的服务器 npm run start
(确保你在 server/
文件夹中)。
我们收到了日志消息,除此之外...就没有太多东西了!我们有一个正在运行的服务器,但仅此而已。浮动在 localhost
空间的真空中,无法访问任何数据,目前来说这是一个悲伤而孤独的服务器。 😿
尽管我们的服务器尚未连接到任何 数据源,但能够向服务器发送测试 查询并获得有效的响应将是一件很棒的事。幸运的是,ApolloServer
提供了一种使用 模拟数据来执行该操作的方法。
要启用 基本模拟数据,我们可以向 ApolloServer构造函数提供 :mocks:true
const server = new ApolloServer({typeDefs,mocks: true,});
这会指示 Apollo Server使用一个占位符值(例如 字符串字段的 "Hello World")填充每个查询的架构 字段。
不过,Hello World
对于曲目标题或作者图片的 URL 来说并不是一个非常现实的值!为服务器提供接近真实情况的模拟数据,我们应该传递一个 对象给 mocks属性,而不是仅仅传递 true
。该对象包含函数,提供了模拟数据,这些数据就是我们希望服务器为每次查询的 字段返回的数据。
下面是我们的 mocks对象:
const mocks = {Track: () => ({id: () => "track_01",title: () => "Astro Kitty, Space Explorer",author: () => {return {name: "Grumpy Cat",photo:"https://res.cloudinary.com/dety84pbu/image/upload/v1606816219/kitty-veyron-sm_mctf3c.jpg",};},thumbnail: () =>"https://res.cloudinary.com/dety84pbu/image/upload/v1598465568/nebula_cat_djkt9r.jpg",length: () => 1210,modulesCount: () => 6,}),};
该对象为 Track对象(包括它所包含的 Author对象)的所有 字段定义了模拟值。我们将此对象传递给 ApolloServer构造函数,如下所示:
const server = new ApolloServer({typeDefs,mocks,});
启用 mocks 后,Apollo Server始终为每个 列表字段返回正好两个条目。
要一次获得更多条目(比如说 6 个),我们将其中的一个 Query.tracksForHome
添加到我们的 mocks
对象并返回一个给定长度的数组,如: [...new Array(6)]
。
const mocks = {Query: () => ({tracksForHome: () => [...new Array(6)],}),Track: () => ({id: () => "track_01",title: () => "Astro Kitty, Space Explorer",author: () => {return {name: "Grumpy Cat",photo:"https://res.cloudinary.com/dety84pbu/image/upload/v1606816219/kitty-veyron-sm_mctf3c.jpg",};},thumbnail: () =>"https://res.cloudinary.com/dety84pbu/image/upload/v1598465568/nebula_cat_djkt9r.jpg",length: () => 1210,modulesCount: () => 6,}),};
创建一个模拟对象,类型为 SpaceCat
,id
为 spacecat_01,title
为“spacecat pioneer”
现在,服务器加载了模拟数据,我们如何在其中运行 查询来测试一切是否按预期工作?在下一课中,我们将使用 Apollo Studio Explorer 轻松构建并运行测试查询。
分享你的问题和对此课程的意见
你的反馈有助于我们提升!如果你遇到问题或感到困惑,请告诉我们,我们会帮助你解决。所有评论都是公开的,必须遵循 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。
你需要一个 GitHub 帐户才能在下面发帖。没有帐户? 改为在我们的 Odyssey 论坛中发帖。