Apollo 客户端本地状态 - LoggedIn 查询

Posted

技术标签:

【中文标题】Apollo 客户端本地状态 - LoggedIn 查询【英文标题】:Apollo Client Local state - LoggedIn Query 【发布时间】:2020-01-23 11:01:02 【问题描述】:

我是使用 GraphQL 的新手。非常习惯使用 Redux,但考虑到新的需求,我已经开始在后端使用 GraphQL 以及用于本地状态管理的 apollo 客户端。我正在尝试实现一个“isLoggedIn”布尔值来确定用户在哪里登录。

根据我的阅读,这就是你的做法:

import withApollo from 'next-with-apollo';
import ApolloClient,  InMemoryCache, gql  from 'apollo-boost';
import typeDefs, resolvers from '../resolvers/index';

const cache = new InMemoryCache();
cache.writeData(
  data: 
    User: 
      isLoggedIn: false,
      email: "empty"
    
  
)

    const IS_LOGGED_IN = gql`
query IsLoggedIn
  User
    isLoggedIn
  
`

`

export default withApollo(
  ( ctx, headers, initialState ) =>
    new ApolloClient(
      uri: "http://localhost:4000/auth/authorize",
      cache: cache,
      headers: 
        authorization: '',
      typeDefs,
      resolvers: 
        User : 
          isLoggedIn: (_, _args, cache) => 
            const isLoggedIn = cache.readQuery(query: IS_LOGGED_IN);
            return isLoggedIn;
          
        
      

    ));

我在状态初始化之前创建了一个缓存对象,这样我就可以写入我最初想要的值(loggedin = false)。

然后我写了一个查询IS_LOGGED_IN来查询状态。

然后我初始化 Apollo 客户端状态并为查询添加解析器。

我感觉自己犯了一个严重错误,但不确定是什么。我目前正在查看的错误是:

Missing field __typename in 
  "isLoggedIn": false,
  "email": "empty"

【问题讨论】:

【参考方案1】:

我的设置是错误的。按照这个家伙的设置,一切正常:https://www.youtube.com/watch?v=CnhHeSAAbRM

【讨论】:

以上是关于Apollo 客户端本地状态 - LoggedIn 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apollo 本地状态存储返回数据的不同表示是不是合适

使用 TypeGraphQL 在浏览器中为 Apollo 本地状态生成 typedef 和解析器

使用 Apollo 链路状态缓存实现客户端过滤

Apollo 客户端解析器仅触发一次

刷新页面时,apollo-state-link 不在缓存中保存状态

Apollo 本地状态 - 使用未知键查询对象