在Apollo中处理未经认证的响应。

问题描述 投票:0回答:1

我正在使用Apollo服务器和Apollo客户端,在处理未认证的响应时遇到了麻烦。在服务器上,我抛出了 AuthenticationError 当发出请求且用户未被认证时,执行一个querymutation。在客户端,当未认证时执行一个querymutation会发送一个错误到捕获块,在那里我可以看到一个图形QLErrors,上面有 "code":"UNAUTHENTICATED"和预期的完全一样。

我想做的是在一个中心位置处理所有这些未认证的响应,这样如果有任何请求返回未认证,我就可以将用户重定向到登录页面。文档中的 apollo-link-error 显示如何使用 onError 作为一个错误处理程序,并给出了一个关于未认证响应的例子。

我在onError中写的代码说 if there are graphQLErrors that have the code "UNAUTHENTICATED", set "response.errors" to "undefined" and redirect to the login page. 这个逻辑似乎和预期的一样,因为任何未经认证的请求都会被重定向到登录页面。

然而,增加了 response.errors = undefined 在apollo-link-error文档的 "忽略错误 "一节中指出,所有未经认证的请求都会抛出一个 Error writing result to store for query 错误。如果我删除 response.errors = undefined 逻辑,那么图形QLErrors "code":"UNAUTHENTICATED" 错误会出现在每一个未经认证的查询块中,这意味着我需要在每一个查询块中加入逻辑来忽略该错误,但显示其他错误。

我是不是做错了什么?我如何使用onErrors来捕获所有 "未认证 "的错误,并防止它们出现在querymutation捕获块中,而不出现上述错误?

apollo apollo-client apollo-server
1个回答
0
投票

这个答案 帮助我分析了这个问题,通过足够的故障排除,我能够针对我的特殊情况得出以下答案。

通过将 "response.errors "设置为undefined,请求承诺被解决而不是被拒绝,并且在 "then "块中被读取的数据不存在,这导致了错误。

我根据回忆写出了下面较长的答案,因为我已经完全改变了我的应用程序中的所有这些逻辑,不再使用这个过程中的任何部分。我只是想为其他有类似问题的人提供一个答案。

我的目标是检查所有响应的身份验证错误,并在必要时重定向到登录页面,或者以其他方式继续按计划进行。理想的情况是,我将从响应中删除验证错误,这样我就可以在查询时仍然处理其他GraphQL错误。也许是我对Apollo(或一般的JS)缺乏经验,但我就是无法让它工作。

下面是我发现的。当使用apollo-link-error的onError方法时,你可以拦截所有带有错误的响应,并可以执行任何你想要的逻辑(例如,如果未认证,则重定向)。然而,这并没有结束这个过程。调用querymutation仍然会收到这个响应,并且可能仍然需要处理这个错误。例如,如果你有一个向用户显示通知的 catch 语句,在 onError 方法中处理的错误仍然会存在于响应中。解决这个问题的一个方法是在响应中添加 response.errors = undefined 到onError方法中。这样做将清除响应中的未认证错误(以及其他错误),然后继续。

这就是我被挂起的地方。通过清除响应中的错误,querymutation承诺将解析而不是拒绝。因为它解析了,"then "块内的任何逻辑都会被执行,这意味着试图从成功的响应中解析的数据现在试图从错误的响应中解析。当然,"then "块可以被更新以检查数据,但在我看来,这首先就违背了承诺的目的。

正是在这一点上,我决定写一个自定义的错误处理程序,并取消onError的使用。我发现自己处理所有的事情要比尝试将一部分委托给apollo-link-error,但仍然要在其他地方处理一些错误处理逻辑更容易。

© www.soinside.com 2019 - 2024. All rights reserved.