4. 解析器 args 参数
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}`);
}

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

✍️ 添加新的解析器

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

在我们的 Query 对象中,我们将在 tracksForHome 下方添加一个新函数。在我们的模式中,我们命名了 track,所以这里它必须有相同的名字。

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

resolvers.js 中,在 tracksForHome 后面添加以下内容:

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

我们之前曾使用过第三个 context,以访问 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 论坛发帖。