4. 解析器参数
4m

📥 检索我们的数据

我们的模式已更新,包含新的类型和新的 用于获取给定轨道。我们需要实现 方法,用于这些新的

我们的 REST API 可以在这里找到https://odyssey-lift-off-rest-api.herokuapp.com

它有一个GET track/:id 终结点,它将轨道 ID 作为参数,并返回该轨道的相应数据。让我们先尝试一下这个终结点:给它一个轨道 ID c_0 并检查它是否为我们提供了所有必要的数据。

Screenshot of REST API docs with focus on the GET track/:id endpoint

以下是完整的 GET /track/c_0 响应:

{
"id": "c_0",
"thumbnail": "https://res.cloudinary.com/dety84pbu/image/upload/v1598465568/nebula_cat_djkt9r.jpg",
"topic": "Cat-stronomy",
"authorId": "cat-1",
"title": "Cat-stronomy, an introduction",
"description": "Curious to learn what Cat-stronomy is all about? Explore the planetary and celestial alignments and how they have affected our space missions.",
"numberOfViews": 0,
"createdAt": "2018-09-10T07:13:53.020Z",
"length": 2377,
"modulesCount": 10,
"modules": [
"l_0",
"l_1",
"l_2",
"l_3",
"l_4",
"l_5",
"l_6",
"l_7",
"l_8",
"l_9"
]
}

仔细观察该响应的形状,我们可以看到我们确实获得了 descriptionnumberOfViews。很棒!我们还获得了一个模块数组,但它们只是 ID,我们还需要更多细节。我们必须使用另一个终结点才能在稍后获取这些细节。

尝试使用 /track/:id 的 REST API 终结点,将 ID c_1 传入。列表中的第一个模块 ID 是什么?

💾 更新 RESTDataSource

让我们来处理我们的 TrackAPI,它是负责调用我们的 REST API 和检索数据的 。我们可以在 server/src/datasources 文件夹中找到它,在 track-api.js 文件中。

让我们创建一个新的方法,根据 ID 获取单个轨道。让我们将它命名为 getTrack,它将 trackId 作为参数。

我们将使用 get 方法(由我们的 RESTDataSource 类提供)来调用 track/:id 终结点,并将 trackId 传递给它。然后,我们将返回结果。

track-api.js 中,将以下方法添加到 TrackAPI 类中:

server/src/datasources/track-api.js
getTrack(trackId) {
return this.get(`track/${trackId}`);
}

现在我们的 正在检索数据,我们的 应该能够使用它!在 升空 II 中,我们已经完成了在 ApolloServer 配置选项中,我们的 之间的连接,所以我们应该能够根据需要添加更多

✍️ 添加一个新的解析器

让我们来处理这个 track 。在 server/src 文件夹中,打开 resolvers.js 文件。

在我们的 Query 对象中,我们将在 tracksForHome 之后添加一个新函数。在我们的模式中,我们为这个 track 命名,所以这里必须使用相同的名称。

回想一下,一个 是一个具有四个可选参数的函数:parentargscontextValueinfo

resolvers.js 中,将以下内容添加到 tracksForHome 之后:

server/src/resolvers.js
track: (parent, args, contextValue, info) => {},

我们之前使用过第三个 contextValue 来访问 dataSources 键。这就是我们的 trackAPI.getTrack 方法所在的位置。该方法需要轨道的 id。我们将在构建 时,将该值作为 指定。

要访问此 id,我们可以使用 中的第二个参数:argsargs 是一个对象,它包含为该 提供的所有 。我们可以解构这个对象来访问 id 属性,然后将该 id 传递给我们的 getTrack 方法。

然后,我们可以返回该方法的结果。

更新 track resolvers.js 中:

track: (parent, {id}, {dataSources}, info) => {
return dataSources.trackAPI.getTrack(id);
},

最后,让我们清理一下我们的另外两个参数。我们可以用下划线替换 parent,因为我们不会使用它,并且可以完全省略最后一个参数 info;我们也不会使用它。

别忘了在上面添加一个简短的注释,以帮助团队成员和未来的你理解这个 的作用。

更新 track resolvers.js 中:

// get a single track by ID, for the track page
track: (_, {id}, {dataSources}) => {
return dataSources.trackAPI.getTrack(id);
},
代码挑战!

spaceCat 字段编写一个解析器函数,以根据 ID 查询一个 spaceCat。遵循上面四个解析器参数的约定,并使用箭头函数语法。使用 dataSources 对象访问 spaceCatsAPI.getSpaceCat() 方法,该方法从 args 中获取 id 并返回结果。

我们已经完成了我们的轨迹 ,但我们的解析器工作尚未完全结束。如果你还记得,我们 REST API 返回的轨迹数据有一个 modules 属性,但它只包含模块 ID 列表。接下来,我们需要确保我们获取了每个模块的详细信息。

上一步

分享你关于本课的疑问和意见

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

你需要一个 GitHub 帐户才能在下面发布。没有吗? 请在我们的 Odyssey 论坛中发布。