Запросы повторной выборки «Неизвестная директива «_».»

#javascript #reactjs #graphql #react-apollo

#javascript #reactjs #graphql #реагировать-apollo

Вопрос:

Я использую react-apollo и <Mutation /> компонент с refetchQueries

UPDATE_TASK

 export const UPDATE_TASK = gql`
  mutation updateTask(
    $id: Int!
    $title: String!
    $priority: PriorityType!
    $assigneeId: String!
    $dueDate: Datetime!
    $details: String!
    $changedAt: Datetime!
  ) {
    updateIssueTaskById(
      input: {
        id: $id
        issueTaskPatch: {
          title: $title
          priority: $priority
          assigneeId: $assigneeId
          dueDate: $dueDate
          details: $details
          changedAt: $changedAt
        }
      }
    ) {
      issueTask {
        id
      }
    }
  }
`;
  

 const onUpdateTask = ({ render }) => <Mutation mutation={UPDATE_TASK} refetchQueries={[{query: GET_TASKS_BY_USER_ID}]} awaitRefetchQueries={true}>
    {(mutation, result, ...rest) => render({ mutation, result, rest })}
  </Mutation>
  

Это работает так, как ожидалось, что начальная мутация отправляет, и мы получаем другой запрос точно так, как мы должны:

введите описание изображения здесь

Это Query и вызывает проблемы:

Полезная нагрузка запроса

 [{
    "operationName": "getTasksByUserId",
    "variables": {},
    "query": "query getTasksByUserId($assigneeId: String!) {n  tasks: allIssueTasks(condition: {assigneeId: $assigneeId, status: OPEN}) @_(get: "edges") {n    edges @_(map: "node") {n      node {n        idn        titlen        createdAtn        priorityn        dueDaten        detailsn        statusn        assigneeIdn        creatorIdn        __typenamen      }n      __typenamen    }n    __typenamen  }n}n"
}]
  

Ответ

 [{
    "errors": [{
        "message": "Unknown directive "_".",
        "locations": [{
            "line": 2,
            "column": 76
        }]
    }, {
        "message": "Unknown directive "_".",
        "locations": [{
            "line": 3,
            "column": 11
        }]
    }]
}]
  

Ответ №1:

@_ Директива — это не встроенная директива, а нечто, добавленное graphql-Lodash, экспериментальной клиентской библиотекой, предназначенной для произвольного преобразования ответов GraphQL. Директива используется только самой библиотекой. Под капотом graphql-lodash фактически удаляет директиву перед отправкой запроса на сервер. Если бы он этого не сделал, сервер получил бы директиву, которую он не распознал, и выдал бы ошибку проверки, подобную той, которую вы видите.

Поскольку вы видите эту ошибку проверки, это означает, что либо вы вообще не используете graphql-Lodash, либо неправильно ее настроили. react-apollo Здесь приведены инструкции по использованию библиотеки с. Самый простой способ — использовать пользовательскую ссылку:

 new ApolloLink((operation, forward) => {
  const { query, transform } = graphqlLodash(operation.query);
  operation.query = query;
  return forward(operation)
    .map(response => ({
      ...response,
      data: transform(response.data),
    }));
});
  

Если вы собираетесь запускать запросы с помощью refetch или refetchQueries , вам следует использовать ссылку, подобную приведенной выше. Использование оболочки HOC не сработает, поскольку запросы будут отправляться непосредственно на сервер без предварительного преобразования библиотекой.

Комментарии:

1. Фантастическая работа Дэниела 🙂 Спасибо, теперь мне нужно решить, как получить эти данные обратно после мутации… поскольку она не передана обратно, насколько я могу видеть.