У меня в проекте React установлен клиент GraphQL с использованием Apollo Boost. Это простая конфигурация, например:
import uuid from 'react-uuid';
import ApolloClient, { gql, InMemoryCache } from 'apollo-boost';
import { config } from '../configs/config';
import { sendNotification } from './ToastService';
const client = new ApolloClient({
uri: config.url.API_URL,
cache: new InMemoryCache({
// eslint-disable-next-line no-underscore-dangle
dataIdFromObject: (o): string | null => (o.id ? `${o.__typename}:${o.id}` : uuid()),
}),
onError: (({ graphQLErrors, networkError }): void => {
if (graphQLErrors) {
graphQLErrors.forEach(({ message }) => {
sendNotification({ type: 'error', title: 'Error', subtitle: message });
});
}
if (networkError) {
sendNotification({ type: 'error', title: 'Error', subtitle: networkError.message });
}
}),
});
export class GraphQLClient<T> {
async query(query: string): Promise<T> {
return client.query({ query: gql`query { ${query} }` })
.then((response) => response.data)
}
}
Мой запрос похож на следующий, где todo_list
и оба children
являются массивами:
query {
my_report {
todo_list {
id
key
value
name
children {
id
key
value
name
children {
id
key
value
name
}
}
}
}
}
Раньше я был возникла проблема, когда элементы в моем todo_list.children
были извлечены, все равны первому элементу. Атрибуты id
и key
во всех списках могут иметь значение NULL. Затем, проведя небольшое исследование, я нашел это исправление, которое я добавил в свой объект конфигурации ApolloClient:
dataIdFromObject: (o): string | null => (o.id ? `${o.__typename}:${o.id}` : uuid()),
Итак, либо todo_list
, либо todo_lis.children
приходят, как ожидалось (тот же результат, который я могу проверить график я ql). Но это исправление не работает на todo_lis.children.children
по какой-то причине я не могу понять. Результаты для todo_lis.children.children
приходят с повторением value
, которые даже не являются частью массива (например, присутствуют в другом родственном массиве). И я проверил и протестировал вывод на графике i ql, и это то, что я ожидал.
Одна вещь, которая вызывает у меня подозрение, это то, что todo_list.children
имеет все id
и key
как NULL (однако они идут с правильными значениями), но todo_list.children.children
имеет все id
s. с некоторым значением (которое является правильным выводом с сервера). Но я действительно не знаю, почему он не работает с функцией dataIdFromObject
, поскольку я правильно устанавливаю id для всех объектов в массивах.
Я ценю любую помощь. Спасибо