#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. Фантастическая работа Дэниела 🙂 Спасибо, теперь мне нужно решить, как получить эти данные обратно после мутации… поскольку она не передана обратно, насколько я могу видеть.