6. 实现查询解析器
4m
你目前处于此课程的旧版本。 查看课程变更日志.

src/resolvers.js中,在我们的 tracksForHome ,添加参数。

在这里参数的顺序很重要。如果我们只添加一个参数,那么函数会将其视为第一个可选参数:parent。我们需要第三个参数context来访问我们的

我们不需要前两个参数,所以按照惯例,我们将它们命名为下划线:第一个参数(parent)使用一个下划线,第二个参数(args)使用两个下划线。

对于context,我们将它解构以访问其子对象dataSources。我们也可以省略第四个参数info,因为我们不会使用它。

server/src/resolvers.js
const resolvers = {
Query: {
// get all tracks, will be used to populate the homepage grid of our web client
tracksForHome: (_, __, { dataSources }) => {},
},
};
编码挑战!

编辑 spaceCats 字段解析器函数的参数,遵循上述说明,并使用箭头函数语法。你需要从上下文参数中解构 dataSources。目前函数不应返回任何内容。

从我们的 dataSources 对象,我们将获得访问我们的 trackAPI (在这里是小写字母,因为它是我们扩展了 RESTDataSource 类的 TrackAPI 类的实例)以及我们之前构建的 getTracksforHome 方法的权限。

我们的 tracksForHome 将返回 那个 TrackAPI 方法的结果。

server/src/resolvers.js
const resolvers = {
Query: {
// get all tracks, will be used to populate the homepage grid of our web client
tracksForHome: (_, __, { dataSources }) => {
return dataSources.trackAPI.getTracksForHome();
},
},
};
module.exports = resolvers;
编码挑战!

为查询的字段 spaceCats 创建一个解析器函数。按照上面解释的约定使用四个可选参数,并使用箭头函数语法。使用 dataSources 对象访问 spaceCatsAPI.getSpaceCats() 方法并返回结果。

这处理了获取我们轨道的数据,但我们还需要每个轨道相关联的作者。我们需要调用我们的 TrackAPI 中的 getAuthor 方法。

那么这个调用应该放在哪里呢?好吧,我们的 tracksForHome 可以遍历返回的轨迹数据,取每个轨迹的 authorId 属性,然后调用 getAuthor。但是,然后我们的 tracksForHome 总是获取作者数据,即使对于根本不请求它的查询也不例外!

相反,让我们为轨道的作者添加另一个 。为此,我们将在我们的 resolvers 对象中添加另一个键,键名为 Track,表示它是我们模式中 Track 类的。在该 Track 键内部将有一个 另一个 对象,具有一个 author ,其中我们将定义我们的

server/src/resolvers.js
const resolvers = {
Query: {
// ...
},
Track: {
author: (parent, args, context, info) => {},
},
};

这次我们需要 parent ,所以让我们将其保留在 函数中。我们可以将 args 替换为下划线。我们从 context 中解构以访问我们的 dataSources 键来访问我们的 TrackAPI。然后省略 info,因为我们不需要它。

server/src/resolvers.js
const resolvers = {
Query: {
// ...
},
Track: {
author: (parent, _, { dataSources }) => {},
},
};

TrackAPIgetAuthor方法需要一个authorId。我们将从这个parent 传递给resolver。这个parent 包含了我们的tracksForHome 返回的数据,因为tracksForHome返回一个列表,会遍历这个列表并在每个track上调用resolver一次。

如果在我们的author 函数内部console.log(parent),打印出的值将会与我们的RESTDataSource返回的原始tracks列表中的单个一模一样。

我们的Track.author resolverparent参数中会包含哪些信息?

现在让我们从parent 中提取authorId。然后,我们将从dataSources.trackAPI方法调用getAuthor方法,传入authorId。最后,我们将返回结果。

server/src/resolvers.js
const resolvers = {
Query: {
// get all tracks, will be used to populate the homepage grid of our web client
tracksForHome: (_, __, { dataSources }) => {
return dataSources.trackAPI.getTracksForHome();
},
},
Track: {
author: ({ authorId }, _, { dataSources }) => {
return dataSources.trackAPI.getAuthor(authorId);
},
},
};
编码挑战!

SpaceCat.missions字段创建一个resolver函数。按照上述说明使用四个可选参数的约定。dataSources对象用于访问spaceCatsAPI.getMissions()方法。catId参数从parent传入并返回结果。

最好实践是,当你在临床上集中解毒和工作时,尽量保持解析函数尽可能薄。这样做可以让你的API对未来的变化更具弹性。你的数据获取代码,或完全从REST API更改为数据库,而无需破坏你的API。

现在,你可能想知道传给我们的 dataSources 对象是从哪里来的。我们是什么时候将它添加到 context 参数中的?现在它 还没有 被添加。如果我们运行服务器,它将没有任何关于我们的 TrackAPI 的了解。它也同样不知道我们的 !让我们确保这三部分彼此连接。

上一步

分享你对这个课程的问题和评论

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

你需要一个GitHub账号来发布以下内容。还没有吗? 请在我们的Odyssey论坛上发帖。