5. 成功解决突变
3m
您目前使用的课程是旧版本。 查看课程更改日志.

🧪 变异解析器

我们已经设置好了我们的,以便PATCH对我们的 REST API 进行了调用。现在是时候编写,让我们的工作起来。

server/src 文件夹中,我们打开 resolvers.js 文件。我们需要在我们的resolvers 对象的 中再添加一个条目。

我们可以将它添加到我们的 Query 的正下方,并且我们需要将它命名得与我们的 schema 中相同,也就是 Mutation(注意大写的M!)。

const resolvers = {
Query: {
// … query resolvers
},
Mutation: {
// where our new resolver function will go
},
};

在此 Mutation 对象中,我们将添加 函数,用于我们的 ,其名称也需要与我们的架构相同,即 incrementTrackViews。当然,我们在开头添加一个有用的注释。

// increments a track's numberOfViews property
incrementTrackViews: (parent, args, context, info) => {},
关于 resolvers 对象的结构,以下哪一个说法是正确的?

我们不需要 parent 作为此 的一部分,因为它用于架构中的根 。按照约定,我们添加一个下划线。的确需要对第二个参数 args 进行解构,以检索 id,这是我们更新的轨迹。和往常一样,我们也将对第三个参数 context 进行解构,以获取 dataSources 对象。最后,我们不需要第四个参数 info

以下显示了我们的 签名:

server/src/resolvers.js
incrementTrackViews: (_, {id}, {dataSources}) => {
// where we'll call the TrackAPI
},

的主体中,我们想要调用添加到 TrackAPI的方法。正如我们在 Lift-off II中看到的,我们可以通过 选项中进行配置,访问 dataSources 对象中的 TrackAPI

所以在 incrementTrackViews 主体内部,我们将调用 dataSources.trackAPI.incrementTrackViews,向它传递 id(来自 args)。

dataSources.trackAPI.incrementTrackViews(id);

到目前为止,我们总是立即返回 TrackAPI调用的结果,因为结果与架构必需的结构相匹配。

然而,在这种情况下,架构所需的三个 不在返回的响应中: codesuccessmessage。这是有道理的,因为它们与 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 property
incrementTrackViews: 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,它获取 spaceshipIdmissionId 作为参数(按该顺序)。此方法返回一个包含新更新的 spaceshipmission 的对象。按照架构要求返回一个对象作为成功的结果。 code 应为 200,success 应为 true,并且 message 应显示 Successfully assigned spaceship ${spaceshipId} to mission ${missionId}

好的,我们已经解决了成功案例,但如果我们的 TrackAPI 抛出错误会怎样?我们会在下一课中解决这个问题。

上一页

分享你关于本课程的问题和评论

您的反馈有助于我们改进服务!如果您遇到问题或感到困惑,请告诉我们,我们会为您提供帮助。所有评论都是公开的,并且必须遵守 Apollo 行为准则。请注意,已解决或处理的评论可能会被删除。

您需要一个 GitHub 帐户才能发表评论。没有帐户? 在我们的 Odyssey 论坛中发帖。