【发布时间】:2018-02-10 00:00:39
【问题描述】:
我正在构建基于 graphql 的身份验证机制,并且我正在试图弄清楚为什么一个与 graphql 连接的组件在重新登录后没有重新呈现...例如:
-
/users我有一个 react-apollo graphql-connected 用户组件,它请求用户列表。 - 如果没有提供令牌,服务器将返回验证错误;组件将
<Redirect>渲染到/login路由;成功登录后,登录组件会隐藏令牌并重定向回来。 - Users 组件包装器启动 graphql 请求并同时呈现“正在加载...”。当 graphql 请求成功时,它会重新渲染并出现用户,耶。
- 如果您从该页面注销,
/logout的注销组件会丢弃该令牌,然后重定向回来;用户组件的请求再次获得身份验证错误并将您发送到“/login”。 - 再次成功登录后,您将返回到“/users”;它再次向服务器发起 graphql 请求(并呈现“正在加载...”),但这一次,当请求成功时,组件不会再次更新。
我可以看到 graphql 请求成功(并且在 Chrome 的调试器中观察到 APOLLO_QUERY_RESULT 操作由 react-apollo 的 reducer 处理并更新存储中的状态)。
我试图找到 React 在哪里检查组件的 props 是否发生了变化,但是我已经足够是一个 React 调试菜鸟了,我还没有弄清楚在 Web 检查器中的哪里可以找到该代码:也许我不明白 React 是如何打包分发的。
我在登录和注销时都清除了 ApolloClient 的存储(通过调用 resetStore()),因为我不想意外重用来自其他身份验证的数据;但是,删除这些调用并不能解决问题。有趣的是(?),如果我通过在graphql() 调用中提供{ options: { fetchPolicy: 'network-only' } } 来强制连接绕过缓存,问题就会消失。 (不是一个可行的解决方案 - 我一般都希望从缓存中受益。)
我已经构建了一个精简的示例:https://github.com/bryanstearns/apollo-auth-experiment 并且您可以在 CodeSandbox 中看到它:https://codesandbox.io/s/m4nlpp86j(您可能希望从 https://m4nlpp86j.codesandbox.io/ 的独立浏览器窗口访问正在运行的示例,因为沙盒编辑器有点让 Web 调试扩展行为怪异)。
【问题讨论】:
标签: reactjs graphql apollo apollo-client