5. 成功解析一个变更
3m

🧪 变更解析器

我们设置了我们的来对我们的 REST API 进行 PATCH 调用。现在是编写 来运行我们的 的时候了。

server/src 文件夹的 resolvers.js 文件中。我们需要添加另一个条目到我们的 resolvers 对象中用于我们的

我们可以在 Query 的正下方添加它,我们需要给它和我们在架构中的名称相同,即 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, contextValue, info) => {},
以下是关于 resolvers 对象结构的哪些说法是正确的?

在此 parent 中,不建议argument,因为它用于架构中的根 。根据惯例,我们只需添加下划线。我们确实需要解构第二个参数 args 才能检索我们正在更新的轨道的 id。和往常一样,我们还将解构第三个参数 contextValue 以获得 dataSources 对象。最后,我们不需要第四个参数 info

以下是我们 的签名:

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

解析器的主体中中,我们要调用添加到 TrackAPI 类中的方法。正如我们在 Lift-off II中看到的,我们能够访问该类的实例 trackAPI,这是通过 dataSources 对象实现的,因为我们在 选项中对其进行了配置。

因此在 incrementTrackViews 主体中,我们将调用 dataSources.trackAPI.incrementTrackViews,并传入 idargs

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将返回 200success属性将设为 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 应为 truemessage 应表示 Successfully assigned spaceship ${spaceshipId} to mission ${missionId}

好极了,我们已经解决了成功的情况,但如果我们的 TrackAPI引发错误会怎么样?让我们在下一课中解决这个问题。

上一个

在此章节,分享您的问题和评论

您的反馈有助于我们提升!如果您遇到困难或感到困惑,请告诉我们,我们将竭诚为您提供帮助。所有评论都是公开的,并且必须遵守 Apollo 行为准则。请注意,可能移除已解决或已处理的评论。

您将需要一个 GitHub 帐户才能在下方发帖。没有吗? 改用我们的 Odyssey 论坛发帖。