useQuery возвращает неопределенное значение, но возвращает данные на игровой площадке gql - PullRequest
0 голосов
/ 26 января 2020
"@apollo/react-hooks": "^3.1.3",
"apollo-client": "^2.6.8",

Клиент Apollo возвращает неопределенное значение в приложении реакции, но возвращает данные на игровой площадке gql, я не понимаю, почему он не работает на стороне клиента, но работает на игровой площадке graphql.

Схема

Я определил объединение для пользовательских запросов для обработки ошибок.

type Query {
  user(id: ID!): UserReturn!
}

union UserReturn = User | Error

type User {
  id: ID!
  username: String!
  email: String
  profileUrl: String
  createdAt: Date
  ads: [Doc!]!
}


type Error {
  message: String
  code: ID
}

Средство разрешения запросов

 async user(_, { id }, { User }) {
    console.log('query - User')
    try {
      await delay(1000 * 3)
      const user = await User.findById(id).populate('userData')
      console.log(user)
      if (!user) return {
        __typename: 'Error',
        message: 'User not found.',
        code: id
      }

      const { _id: id, username, email, createdAt, userData: { profileUrl } } = user

      console.log(username)
      return {
        __typename: 'User',
        id,
        username,
        email,
        createdAt,
        profileUrl
      }
    } catch (err) {
      console.log(err)
      return {
        __typename: 'Error',
        message: 'Something went wrong while getting user.',
        code: LogBack(err, `query/user?id=${id}`, __filename)
      }
    }
  }

При запросе на детской площадке gql

на детской площадке graphql, запрос работает.

Screenshot from 2020-01-25 23-44-01_censored

На стороне клиента

 const { data } = useQuery(
    gql`query user($id: ID!) {
      user(id: $id) {
        __typename
        ... on User {
          id
          username
          email
          profileUrl
          createdAt
          # ads
        }
        ... on Error {
          message
          code
        }
      }
    }
    `,
    {
      variables: {
        id: userId
      }
    }
  );

  console.log(data) // undefined

useQuery запускается, но возвращает undefiend.

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Я могу запросить объявления, добавив IntrospectionFragmentMatcher в настройки моего клиента apollo

Это помогает мне исправить

Вот как я могу решить проблему .

import { InMemoryCache, IntrospectionFragmentMatcher } from "apollo-cache-inmemory";

const fragmentMatcher = new IntrospectionFragmentMatcher({
  introspectionQueryResultData: {
    __schema: {
      types: [
        {
          "kind": "UNION",
          "name": "AdsReturn",
          "possibleTypes": [
            {
              "name": "Ads"
            },
            {
              "name": "Error"
            }
          ]
        },
      ],
    },
  }
});


export default new ApolloClient({
  link: ApolloLink.from([errorLink, authLink, httpLink]),
  cache: new InMemoryCache({ fragmentMatcher }),
});

0 голосов
/ 26 января 2020

что-то, что могло бы помочь, вы знаете, где вы вызываете {data}, вы также можете найти error и console.log ('Error:', error)

проверить клиентский запрос apollo docs

как то так, и посмотрите на сообщение об ошибке, оно должно помочь!

import { useQuery } from '@apollo/react-hooks';
import gql from 'graphql-tag';

const GET_GREETING = gql`
  query getGreeting($language: String!) {
    greeting(language: $language) {
      message
    }
  }
`;

function Hello() {
    const { loading, error, data } = useQuery(GET_GREETING, {
    variables: { language: 'english' },
  });
  if (loading) return 'Loading...';
  if (error) return `Error! ${error.message}`;
  return <h1>Hello {data.greeting.message}!</h1>;
}
...