🚨 处理错误情况
正如我们在 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,但我们还可以更加动态,并使用 Apollo Server 和 RESTDataSource 类提供的值。当发生错误时,Apollo Server 会将该错误附加一个 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 块,并在可能的情况下返回动态错误数据。
mutation 已准备好,可以用于在 Apollo 沙箱 Explorer 中进行测试。让我们开始吧。
分享您对这个课程的问题和评论
您的反馈有助于我们改进!如果您遇到困难或感到困惑,请告诉我们,我们将帮助您。所有评论都是公开的,必须遵守 Apollo 行为准则。注意,已经解决或处理的评论可能会被删除。
您需要 GitHub 账户才能发表以下评论。还没有账号? 请在我们的 Odyssey 论坛上发布。