📥 检索我们的数据
我们的模式已更新,包含新的类型和新的查询 用于获取给定轨道。我们需要实现 解析器 和 数据源 方法,用于这些新的 字段。
我们的 REST API 可以在这里找到https://odyssey-lift-off-rest-api.herokuapp.com。
它有一个GET track/:id
终结点,它将轨道 ID 作为参数,并返回该轨道的相应数据。让我们先尝试一下这个终结点:给它一个轨道 ID c_0
并检查它是否为我们提供了所有必要的数据。
以下是完整的 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"]}
仔细观察该响应的形状,我们可以看到我们确实获得了 description
和 numberOfViews
。很棒!我们还获得了一个模块数组,但它们只是 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
类中:
getTrack(trackId) {return this.get(`track/${trackId}`);}
现在我们的 数据源 正在检索数据,我们的 解析器 应该能够使用它!在 升空 II 中,我们已经完成了在 ApolloServer
配置选项中,我们的 解析器 和 数据源 之间的连接,所以我们应该能够根据需要添加更多 解析器。
✍️ 添加一个新的解析器
让我们来处理这个 track
解析器。在 server/src
文件夹中,打开 resolvers.js
文件。
在我们的 Query
对象中,我们将在 tracksForHome
之后添加一个新函数。在我们的模式中,我们为这个 字段track
命名,所以这里必须使用相同的名称。
回想一下,一个 解析器 是一个具有四个可选参数的函数:parent
、args
、contextValue
和 info
。
在 resolvers.js
中,将以下内容添加到 tracksForHome
解析器 之后:
track: (parent, args, contextValue, info) => {},
我们之前使用过第三个 参数 contextValue
来访问 dataSources
键。这就是我们的 trackAPI.getTrack
方法所在的位置。该方法需要轨道的 id
。我们将在构建 查询 时,将该值作为 参数 指定。
要访问此 id
,我们可以使用 解析器 中的第二个参数:args
。args
是一个对象,它包含为该 字段 提供的所有 GraphQL 参数。我们可以解构这个对象来访问 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 pagetrack: (_, {id}, {dataSources}) => {return dataSources.trackAPI.getTrack(id);},
为 spaceCat
字段编写一个解析器函数,以根据 ID 查询一个 spaceCat。遵循上面四个解析器参数的约定,并使用箭头函数语法。使用 dataSources
对象访问 spaceCatsAPI.getSpaceCat()
方法,该方法从 args
中获取 id
并返回结果。
我们已经完成了我们的轨迹 解析器,但我们的解析器工作尚未完全结束。如果你还记得,我们 REST API 返回的轨迹数据有一个 modules
属性,但它只包含模块 ID 列表。接下来,我们需要确保我们获取了每个模块的详细信息。
分享你关于本课的疑问和意见
你的反馈有助于我们改进!如果你卡住了或感到困惑,请告诉我们,我们会帮助你。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。
你需要一个 GitHub 帐户才能在下面发布。没有吗? 请在我们的 Odyssey 论坛中发布。