Клиент Apollo выдает ошибку «магазин уже содержит идентификатор» - что это значит?

В собственном проекте реакции я создаю объект, а затем перенаправляю экран на страницу сведений о вновь созданном объекте и получаю эту ошибку:

Возможное отклонение необработанного обещания (id: 0): сетевая ошибка: ошибка хранилища: приложение попыталось записать объект без предоставленного идентификатора, но хранилище уже содержит идентификатор XYZ для этого объекта.

Глядя в базу данных, я вижу, что элемент правильно создан на предыдущем шаге. Переход к тому же экрану и элементу через список (не после создания и перенаправления), похоже, работает нормально. Должен ли я подождать или как-то установить какое-то время, чтобы магазин Apollo оставался правильным?

Я использую стандартный клиент apollo @graphql для привязки / упаковки

gql:

 query getEvent($eventId: ID!) {
    Event(id:$eventId) {
      id
      headline
      photo
      location
      startTime
      creator {
        username
        photo
      }
    }
  }
`;

А вот фрагмент кода

@graphql(getEventGql,{
  options: ({route}) => {
    console.log('route params', route.params);
    return {
      variables: {
        eventId: route.params.eventId,
      }
    }
  },
})

@connect((state) => ({ user: state.user }))
export default class EventDetailScreen extends Component {
...

person MonkeyBonkey    schedule 30.01.2017    source источник


Ответы (1)


Вы также должны добавить id в поле creator:

query getEvent($eventId: ID!) {
    Event(id:$eventId) {
      id
      headline
      photo
      location
      startTime
      creator {
        id
        username
        photo
      }
    }
  }

В общем, не забудьте добавить id во все подразделы ваших запросов.

person marktani    schedule 01.02.2017
comment
Была эта ошибка, когда не было необходимости в идентификаторе во вложенном свойстве, но нужен идентификатор на корневом уровне, поэтому этот ответ был полезен. Я был бы признателен за объяснение, почему. - person ABCD.ca; 27.04.2017
comment
@ ABCD.ca Я не уверен на 100%, но похоже, что какое-то кеширование результатов происходит, поэтому вы должны предоставить уникальный идентификатор для клиента apollo, чтобы его получить. Имеет смысл, но у меня не было этой проблемы до выпуска 1.0.0, поэтому я временно вернулся к 0.10.1 - person ViggoV; 30.05.2017
comment
Также будьте осторожны, включайте __typename или избегайте его, если вы тестируете с помощью MockProvider. Но в некоторых случаях вы должны включить __typename разрешение в MockProvider - person Javier Gutierrez; 07.06.2019