🚨 处理错误情况
正如我们在 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 论坛上发布。