简体   繁体   English

无法从 graphql 本地查询中获取我的反应变量

[英]Can't get my reactive variable from graphql local query

I'm trying to setup a Apollo 3 local state with react.我正在尝试通过反应设置 Apollo 3 本地状态。 For an unknown reason my query does not work when I try to read a custom type (isAuthenticated query works well).由于未知原因,当我尝试读取自定义类型时,我的查询不起作用(isAuthenticated 查询运行良好)。 Can you please help me to understand I literaly explored all the documentation and the link on internet about local state management.你能帮我理解一下,我确实浏览了互联网上有关本地状态管理的所有文档和链接。

Thank you谢谢

cache.js缓存.js

import { InMemoryCache, makeVar, gql } from '@apollo/client'

export const isAuthenticatedVar = makeVar(!!localStorage.getItem('token'))
export const userVar = makeVar("")

export const cache = new InMemoryCache({
  typePolicies: {
    Query: {
      fields: {
        isAuthenticated: {
          read() {
            return isAuthenticatedVar()
          }
        },
        user: {
          read() {
            return userVar()
          },
          __typename: 'User',
        }
      }
    }
  }
})

export const IS_AUTHENTICATED = gql`
  query IS_AUTHENTICATED {
    isAuthenticated @client
  }
`

export const GET_LOCAL_USER = gql`
  query GET_LOCAL_USER {
    user @client
  }
`

typedej.js typedej.js

import { gql } from '@apollo/client'

export const typeDef = gql`

  extend type User {
    id: ID!
    name: String!
    surname: String!
    email: String!
    password: String!
    phone: String!
    adress: Adress!
    isAdmin: Boolean!
    isCoach: Boolean!
    isManager: Boolean!
  }

  extend type Query {
    isAuthenticated: Boolean!
    user: User!
  }
`

export default typeDef

test.js测试.js

const login = (email, password) => {
    const emailLower = email.toLowerCase()
    client.query({
      query: LOGIN,
      variables: { email: emailLower, password: password }
    })
    .then(result => {
      console.log(result)
      localStorage.setItem('token', result.data.login.token)
      localStorage.setItem('userId', result.data.login.user.id)
      
      isAuthenticatedVar(true)
      userVar({ ...result.data.login.user})
      console.log('USER VAR SETUP')
      ///Console.log show that userVar contains an object with all User data
      console.log(userVar())
      var test 
      try{
        //test return NULL object
        test = client.readQuery({ query: GET_LOCAL_USER}).user
      }catch(error) {
        console.log(error)
      }
      console.log('FETCH QUERY userVar')
      console.log(test)

      navigate("/")
    })
    .catch(error => {
      console.log(error)
    })
  }

Tried several ways but can't find how to resolve this.尝试了几种方法,但找不到解决方法。 I don't understand why documentation don't explain how to use with Object Type我不明白为什么文档没有解释如何使用对象类型

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM