6. 处理具有错误的变更
2m
你当前所在的课程版本较旧。 查看课程变更日志.

🚨 处理错误案例

正如我们在 REST API 中所看到的,在尝试更新不存在的曲目指令时,可能会收到一个404 Not Found响应。当这种情况发生时,让我们来看看如何返回适当的

让我们在 server/src文件夹中再次打开 resolvers.js文件。

我们已经为我们的 incrementTrackViews 准备好成功响应。为了应对 TrackAPI 调用抛出错误的情况,我们将该部分放入 try 块中。

当抛出错误时,我们会通过添加 catch 来确保能捕获它,该 catch 会将错误作为参数。

incrementTrackViews: async (_, {id}, {dataSources}) => {
try {
const track = await dataSources.trackAPI.incrementTrackViews(id);
return {
code: 200,
success: true,
message: `Successfully incremented number of views for track ${id}`,
track
};
} catch (err) {
return {
// we'll return a new object here
};
}
},

然后,我们返回一个对象,其属性与成功中的对象相同,但值不同。

我们可以将 code 设置为 404,但我们也可以更灵活,使用 RESTDataSource 类提供的值。发生错误时, 会在该错误中附加一个 extensions ,该 extensions 包含相关的错误详细信息。

在这种情况下,由于我们的 TrackAPI 扩展了 RESTDataSource,因此此 extensions 对象将通过 response 属性得到扩充,该属性提供了一些关于 HTTP 响应本身的其他信息。我们可以返回 status 属性,该属性引用 HTTP 状态代码。这里非常适合使用该属性!

code: err.extensions.response.status,

接下来,我们可以将我们的 success 属性设置为 false

success: false,

针对 message 属性,我们可以构建一个自定义属性,不过我们不如从同一个 extensions.response 对象中使用另一个值。也就是 extensions.response.body 属性。这样做可以提高该值动态性,因为该值将来可能返回其他类型的错误。

message: err.extensions.response.body,

最后,我们会添加一个 track 属性并将其设置为 null,这是因为未成功修改对象。

关于服务器返回的 error.extensions 字段,以下哪些陈述是正确的?

现在 incrementTrackViews 应如下所示,其中添加了错误处理:

incrementTrackViews: async (_, {id}, {dataSources}) => {
try {
const track = await dataSources.trackAPI.incrementTrackViews(id);
return {
code: 200,
success: true,
message: `Successfully incremented number of views for track ${id}`,
track
};
} catch (err) {
return {
code: err.extensions.response.status,
success: false,
message: err.extensions.response.body,
track: null
};
}
},
解析器会处理成功响应和可能的错误这两种情况。关于这两个用例的返回对象,以下哪些是正确的?
代码挑战!

我们从与前一个代码挑战中相同的 assignSpaceship Mutation 解析程序示例开始。这次,我们假设 dataSources.spaceAPI.assignSpaceshipToMission() 调用将返回一个错误。修改以下代码片段以正确处理 API 返回的错误,并返回一个格式正确、并且符合 AssignSpaceshipResponse 类型模式定义的对象。记住使用 try/catch 块,并在可能时返回动态错误数据。

太棒了,这个 已准备就绪,可在 Explorer 中进行测试!让我们开始吧。

前一个

分享你对本课的疑问和评论

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

在下方发帖需要一个 GitHub 账户。没有帐户? 转而在我们的 Odyssey 论坛中发帖。