阿波罗客户端查询保护路由

Posted

技术标签:

【中文标题】阿波罗客户端查询保护路由【英文标题】:apollo client query protected route 【发布时间】:2018-09-12 23:44:45 【问题描述】:

我正在尝试在我的 graphql react 应用程序中使用私有路由方法应用受保护的路由。我正在使用 apollo 客户端 2。

私有路由按预期工作,即它保护/防止某人手动输入 url(在本例中为 /surveys)。但是,当手动重新加载或刷新页面时,graphql 查询最初会返回一个空对象数据(当用户登录时)或未定义的数据。因此,应用了私有路由内的重定向条件,因此客户端被重定向到“/”路径。有没有办法解决?这是我的应用程序和我的私人路线代码:

/* app.js */
....imports

const WHOAMI = gql`
  query whoAmI 
    whoAmI 
      _id
      email
    
  
`;

class App extends Component 
  render() 
    return (
      <div>
        <BrowserRouter>
          <div>
            <Header />
            <Query query=WHOAMI>
              ( loading, error, data ) => 
                // console.log(data);
                return (
                  <div className="container">
                    <div className="col s12 center-align">
                      <Switch>
                        <Route path="/surveys/new" component=SurveyNew />
                        <PrivateRoute
                          path="/surveys"
                          userId=data.whoAmI
                          component=SurveyList
                        />
                        <Route path="/" exact component=LandingPage />
                      </Switch>
                    </div>
                  </div>
                );
              
            </Query>
          </div>
        </BrowserRouter>
      </div>
    );
  


export default App;

还有我的 PrivateRouter 文件

...imports 

const PrivateRoute = ( component: Component, userId, ...rest ) => (  
  <Route ...rest render=props => (
    !userId || userId === 'undefined' ? (
      <Redirect to=
        pathname: '/'
        
      />
    ) : (
      <Component ...props />
    )
  ) />
);


export default PrivateRoute

【问题讨论】:

【参考方案1】:

我的架构可能和我一样

class App extends Component 
  constructor (...args) 
    super(...args)

    this.state = 
      user: ,
      loading: true
    
  

  componentDidMount() 
    fetchUser()
      .then(user => 
        this.setState(
          user,
          loading: false
        )
      )
  

  render () 
    if (this.state.loading) 
      return <LoadingPage />
     else 
      return (
        <ApolloProvider client=client>
          <BrowserRouter>
            ...
          <BrowserRouter />
        </ApolloProvider>  
    

【讨论】:

嗨,我正在尝试使用 Apollo 来管理我的状态而不是 redux,我认为我的问题的解决方案可能与用于本地状态管理的新 apollo-link-state 有关跨度> @scubadude 好吧,我的示例中根本没有使用 Redux,概念是一样的,您只需检查 Query 的 data.loading 内部渲染,并根据此条件返回 BrowserRouter ,或显示正在加载的特殊组件。

以上是关于阿波罗客户端查询保护路由的主要内容,如果未能解决你的问题,请参考以下文章

带参数的阿波罗客户端查询 - Vue

Apollo 客户端调用每个突变和查询两次(React)

GraphQL 角度阿波罗客户端。从缓存中读取抛出错误,但对服务器的相同查询工作正常

阿波罗客户端- [未处理的承诺拒绝:错误:响应不成功:收到状态代码 400]

阿波罗客户端在反应原生的初始重新加载中返回未定义

在查询中找到 @client 指令,但未指定 ApolloClient 解析器