Я использую react-apollo и компонент <Mutation /> с refetchQueries
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 id\n title\n createdAt\n priority\n dueDate\n details\n status\n assigneeId\n creatorId\n __typename\n }\n __typename\n }\n __typename\n }\n}\n"
}]
[{
"errors": [{
"message": "Unknown directive \"_\".",
"locations": [{
"line": 2,
"column": 76
}]
}, {
"message": "Unknown directive \"_\".",
"locations": [{
"line": 3,
"column": 11
}]
}]
}]



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Директива @_ — это не встроенная директива, а добавленная 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 не сработает, так как запросы будут отправляться напрямую на сервер без предварительного преобразования библиотекой.
Фантастическая работа, Дэниел :) Спасибо, теперь мне нужно решить, как вернуть эти данные из мутации ... поскольку, насколько я вижу, они не возвращены.