Клиент Apollo не читает переменные, передаваемые с использованием хука useQuery - PullRequest
4 голосов
/ 13 февраля 2020

При странной проблеме передачи переменных в хук useQuery.

Запрос:

const GET_USER_BY_ID= gql`
  query($id: ID!) {
    getUser(id: $id) {
      id
      fullName
      role
    }
  }
`;

Вызов запроса:

const DisplayUser: React.FC<{ id: string }> = ({ id }) => {
  const { data, error } = useQuery(GET_USER_BY_ID, {
    variables: { id },
  });

  return <div>{JSON.stringify({ data, error })}</div>;
};

Рендеринг компонента:

<DisplayUser id="5e404fa72b819d1410a3164c" />

Это приводит к ошибке:

"Argument \"id\" of required type \"ID!\" was provided the variable \"$id\" which was not provided a runtime value."

Вызов запроса из GraphQL Playground возвращает ожидаемый результат:

{
  "data": {
    "getUser": {
      "id": "5e404fa72b819d1410a3164c",
      "fullName": "Test 1",
      "role": "USER"
    }
  }
}

И вызов запроса без переменной, но вместо этого жесткое кодирование id:

const GET_USER_BY_ID = gql`
  query {
    getUser(id: "5e404fa72b819d1410a3164c") {
      id
      fullName
      role
    }
  }
`;

const DisplayUser: React.FC = () => {
  const { data, error } = useQuery(GET_USER_BY_ID);

  return <div>{JSON.stringify({ data, error })}</div>;
};

Также возвращает ожидаемый результат.

Я также пытался протестировать аналогичный запрос, который принимает firstName: String! в качестве параметра, который также приводит к ошибке говоря, что переменной не было предоставлено значение времени выполнения. Этот запрос также работает должным образом при жестком кодировании значения в строке запроса.

Этот проект был запущен сегодня и использует "apollo-boost": "^0.4.7", "graphql": "^14.6.0" и "react-apollo": "^3.1.3".

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

[решено]

При чтении трассировки стека я заметил, что проблема связана с graphql-query-complexity, который я использовал для validationRules. Я удалил правила проверки и теперь все работает! Конечно, в настоящее время у меня нет подтверждения, но я могу работать отсюда. Спасибо всем, кто нашел время ответить!

0 голосов
/ 13 февраля 2020

Я также столкнулся с подобной проблемой и не был уверен, что происходит. Кажется, здесь описана похожая проблема - https://github.com/apollographql/graphql-tools/issues/824

У нас есть 2 варианта решения проблемы. - Во-первых, это простое исправление, при котором вы не делаете обязательным ID, когда он принимает только один параметр (который не является объектом)

const GET_USER_BY_ID= gql`
  query($id: ID) {
  • Второй вариант - используйте объект в качестве параметра вместо примитива. Я пошел вперед с этим, и мне показалось, что он работает нормально, хотя я сделал объект и собственность внутри необходимыми. // На клиенте

const GET_USER_BY_ID= gql`
   query($input: GetUserInput!) {
     getUser(input: $input) {
        id
        fullName
        role
     }
}`;  
        
const { data, error } = useQuery(GET_USER_BY_ID, {
  variables: { input: { id }},
});

// На сервере определите тип ввода

  input GetUserInput {
      id: ID!
    }
...