6. 解决带有错误的变更
2m

🚨 处理错误情况

正如我们在 REST API 中看到的,当尝试更新一个不存在的曲目时,它会产生一个404 Not Found 响应。让我们看看在这种情况下如何返回适当的

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

我们已经准备好了对 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 ,其中包含相关的错误详细信息。

在这种情况下,由于我们的 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,因为对象没有被成功修改。

服务器返回的以下哪个关于 err.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 论坛上发布。