🚨 处理错误案例
正如我们在 REST API 中所看到的,在尝试更新不存在的曲目指令时,可能会收到一个404 Not Found
响应。当这种情况发生时,让我们来看看如何返回适当的 字段。
让我们在 server/src
文件夹中再次打开 resolvers.js
文件。
我们已经为我们的 incrementTrackViews
mutation 准备好成功响应。为了应对 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 服务器 和 RESTDataSource
类提供的值。发生错误时,Apollo 服务器 会在该错误中附加一个 extensions
field,该 extensions
field 包含相关的错误详细信息。
在这种情况下,由于我们的 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 块,并在可能时返回动态错误数据。
太棒了,这个 突变已准备就绪,可在 Apollo 沙盒Explorer 中进行测试!让我们开始吧。
分享你对本课的疑问和评论
你的反馈有助于我们改进!如果你遇到困难或感到困惑,请告诉我们,我们会帮助你。所有评论都是公开的,并且必须遵循 Apollo 行为准则。请注意,已解决或已解决的评论可能会被删除。
在下方发帖需要一个 GitHub 账户。没有帐户? 转而在我们的 Odyssey 论坛中发帖。