🧪 变异解析器
我们已经设置好了我们的数据源,以便PATCH
对我们的 REST API 进行了调用。现在是时候编写解析器,让我们的数据源工作起来。
在 server/src
文件夹中,我们打开 resolvers.js
文件。我们需要在我们的resolvers
对象的 mutation中再添加一个条目。
我们可以将它添加到我们的 Query
解析器的正下方,并且我们需要将它命名得与我们的 schema 中相同,也就是 Mutation
(注意大写的M!)。
const resolvers = {Query: {// … query resolvers},Mutation: {// where our new resolver function will go},};
在此 Mutation
对象中,我们将添加 resolver 函数,用于我们的 mutation,其名称也需要与我们的架构相同,即 incrementTrackViews
。当然,我们在开头添加一个有用的注释。
// increments a track's numberOfViews propertyincrementTrackViews: (parent, args, context, info) => {},
resolvers
对象的结构,以下哪一个说法是正确的?我们不需要 parent
参数 作为此 resolver 的一部分,因为它用于架构中的根 字段。按照约定,我们添加一个下划线。的确需要对第二个参数 args
进行解构,以检索 id
,这是我们更新的轨迹。和往常一样,我们也将对第三个参数 context
进行解构,以获取 dataSources
对象。最后,我们不需要第四个参数 info
。
以下显示了我们的 resolver 签名:
incrementTrackViews: (_, {id}, {dataSources}) => {// where we'll call the TrackAPI},
在 解析器的主体中,我们想要调用添加到 TrackAPI
的方法。正如我们在 Lift-off II中看到的,我们可以通过 Apollo Server选项中进行配置,访问 dataSources
对象中的 TrackAPI
所以在 incrementTrackViews
解析器主体内部,我们将调用 dataSources.trackAPI.incrementTrackViews
,向它传递 id
(来自 args
)。
dataSources.trackAPI.incrementTrackViews(id);
到目前为止,我们总是立即返回 TrackAPI
调用的结果,因为结果与架构必需的结构相匹配。
然而,在这种情况下,架构所需的三个 字段不在返回的响应中: code
、 success
和 message
。这是有道理的,因为它们与 REST 操作状态本身相关,所以我们需要根据该状态设置这三个状态。
TrackAPI
调用的结果?📄 满足架构要求
首先,让我们等待 TrackAPI
调用的数据返回完成为止。我们可以通过使该函数 async
, 然后将其结果存储在名为 variable 的 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 论坛中发帖。