🧪 变更解析器
我们设置了我们的数据源来对我们的 REST API 进行 PATCH
调用。现在是编写 解析器 来运行我们的 数据源 的时候了。
在 server/src
文件夹的 resolvers.js
文件中。我们需要添加另一个条目到我们的 resolvers
对象中用于我们的 变更。
我们可以在 Query
resolvers 的正下方添加它,我们需要给它和我们在架构中的名称相同,即 Mutation
(注意大写的 M!)
const resolvers = {Query: {// ... query resolvers},Mutation: {// where our new resolver function will go},};
在此 Mutation
中,我们将为 mutation 添加 resolver 函数,它还需要具有与架构中的相同名称 incrementTrackViews
。当然,让我们在顶部添加一个有用的注释。
// increments a track's numberOfViews propertyincrementTrackViews: (parent, args, contextValue, info) => {},
resolvers
对象结构的哪些说法是正确的?在此 parent
resolver 中,不建议argument
,因为它用于架构中的根 field。根据惯例,我们只需添加下划线。我们确实需要解构第二个参数 args
才能检索我们正在更新的轨道的 id
。和往常一样,我们还将解构第三个参数 contextValue
以获得 dataSources
对象。最后,我们不需要第四个参数 info
。
以下是我们 resolver 的签名:
incrementTrackViews: (_, { id }, { dataSources }) => {// where we'll call the TrackAPI},
解析器的主体中解析器中,我们要调用添加到 TrackAPI
类中的方法。正如我们在 Lift-off II中看到的,我们能够访问该类的实例 trackAPI
,这是通过 dataSources
对象实现的,因为我们在 Apollo Server 选项中对其进行了配置。
因此在 incrementTrackViews
解析器 主体中,我们将调用 dataSources.trackAPI.incrementTrackViews
,并传入 id
从 args
。
dataSources.trackAPI.incrementTrackViews(id);
到目前为止,我们一直立即返回 TrackAPI
调用结果,因为这些结果与架构要求的结构相匹配。
但是,在这种情况下,我们有三个架构要求的 字段 不存在于返回的响应中: code
、 success
和 message
。这是合理的,因为它们与 REST 操作 状态本身相关,因此我们需要基于该状态设置这三个字段。
TrackAPI
调用的结果?📄 满足架构要求
首先,我们等待 TrackAPI
调用完成并返回数据。我们可以通过将该函数设为 async
,然后将结果存储在名为 track
的 变量中,确保 await
结果。
incrementTrackViews: async (_, {id}, {dataSources}) => {const track = await dataSources.trackAPI.incrementTrackViews(id);},
接下来,返回一个包含满足架构所需所有属性的对象。现在,我们假设 API 调用成功,并在下一课中处理错误处理。
return {code: 200,success: true,message: `Successfully incremented number of views for track ${id}`,track,};
因此,此处 code
将返回 200
, success
属性将设为 true
,我们可以返回 message
以表示此特定曲目 ID 的观看次数已成功增加。最后,我们可以返回修改后的对象 track
。
最后, resolvers
对象应包含一个类似这样的新条目:
Mutation: {// increments a track's numberOfViews propertyincrementTrackViews: async (_, { id }, { dataSources }) => {const track = await dataSources.trackAPI.incrementTrackViews(id);return {code: 200,success: true,message: `Successfully incremented number of views for track ${id}`,track,};},},
为架构中提供的 assignSpaceship
新变异添加一个解析器,使用箭头函数语法。使用 dataSources.spaceAPI
类及其方法 assignSpaceshipToMission
,该方法采用 spaceshipId
和 missionId
作为自变量(按该顺序)。此方法返回包含新更新的 spaceship
和 mission
的对象。按照架构要求返回成功结果的对象。 code
应为 200
,success 应为 true
, message
应表示 Successfully assigned spaceship ${spaceshipId} to mission ${missionId}
好极了,我们已经解决了成功的情况,但如果我们的 TrackAPI
引发错误会怎么样?让我们在下一课中解决这个问题。
在此章节,分享您的问题和评论
您的反馈有助于我们提升!如果您遇到困难或感到困惑,请告诉我们,我们将竭诚为您提供帮助。所有评论都是公开的,并且必须遵守 Apollo 行为准则。请注意,可能移除已解决或已处理的评论。
您将需要一个 GitHub 帐户才能在下方发帖。没有吗? 改用我们的 Odyssey 论坛发帖。