📥 检索我们的数据
我们的架构已经更新了新的类型和新的查询用于获取特定轨道。我们需要实现 解析器 和 数据源 方法以获取这些新的 字段。
我们的 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}`);}
现在我们的 数据源 正在检索数据,我们的 解析器 应该能够使用它了!在 Lift-off II中,我们已经在 解析器 和 数据源 之间的 ApolloServer
配置选项中实现了连接,所以应该可以根据需要添加更多 解析器。
✍️ 添加新的解析器
让我们处理这个 track
解析器。在 server/src
文件夹中,打开 resolvers.js
文件。
在我们的 Query
对象中,我们将在 tracksForHome
下方添加一个新函数。在我们的模式中,我们命名了 字段track
,所以这里它必须有相同的名字。
回想一下, 解析器 是一个具有四个可选参数的函数: parent
、args
、context
和 info
。
在 resolvers.js
中,在 tracksForHome
解析器 后面添加以下内容:
track: (parent, args, context, info) => {},
我们之前曾使用过第三个参数 context
,以访问 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 论坛发帖。