Пустой объект данных возвращается в <Query>после применения мутации для того же - PullRequest
0 голосов
/ 10 сентября 2018

Выложенный здесь выпуск Github

"apollo-boost": "^0.1.13",
"apollo-link-context": "^1.0.8",
 "graphql": "^0.13.2",
"graphql-tag": "^2.9.2",
"react-apollo": "^2.1.11",

Структура текущего кода

<div>
<Query
    query={FETCH_CATEGORIES_AUTOCOMPLETE}
    variables={{ ...filters }}
    fetchPolicy="no-cache"
  >
    {({ loading, error, data }) => {
      console.log('category', loading, error, data); // _______Label_( * )_______
      if (error) return 'Error fetching products';

      const { categories } = data;

      return (
        <React.Fragment>
          {categories && (
            <ReactSelectAsync
              {...this.props.attributes}
              options={categories.data}
              handleFilterChange={this.props.handleCategoryFilterChange}
              loading={loading}
              labelKey="appendName"
            />
          )}
        </React.Fragment>
      );
    }}
  </Query>

<Mutation mutation={CREATE_CATEGORY}>
  {createCategory => (
    <div>
    // category create form
    </div>
  )}
</Mutation>
</div>

Поведение

Изначально запрос извлекает данные, и я получаю список категорий внутри данных given in Label_( * ). После ввода данных формы, отправка происходит успешно. Issue: Затем, внезапно, в Label_( * ) объект данных становится пустым.

Как я могу решить эту проблему?

Редактировать

Это ответ:

Категории GET

{
  "data": {
    "categories": {
      "page": 1,
      "rows": 2,
      "rowCount": 20,
      "pages": 10,
      "data": [
        {
          "id": "1",
          "appendName": "Category A",
          "__typename": "CategoryGETtype"
        },
        {
          "id": "2",
          "appendName": "Category B",
          "__typename": "CategoryGETtype"
        }
      ],
      "__typename": "CategoryPageType"
    }
  }
}

Категория Создать

{
  "data": {
    "createCategory": {
      "msg": "success",
      "status": 200,
      "category": {
        "id": "21",
        "name": "Category New",
        "parent": null,
        "__typename": "CategoryGETtype"
      },
      "__typename": "createCategory"
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 09 января 2019

(я столкнулся с этим вопросом, когда столкнулся с аналогичной проблемой, которую я сейчас решил)

В Apollo, когда мутация возвращает данные, которые используются в другом запросе, результаты этого запроса будутбыть обновленным.например, этот запрос, который возвращает все задачи

query { 
  todos { 
    id
    description
    status
  }
}

Затем, если мы помечаем задачу как выполненную с мутацией

mutation CompleteTodo {
  markCompleted(id: 3) { 
    todo { 
      id
      status
    }
  }
}

И результат будет

{ 
  todo: {
    id: 3,
    status: "completed"
    __typename: "Todo" 
  }
}

Тогда статус элемента todo с идентификатором 1 будет обновлен.Проблема возникает, когда мутация сообщает запросу, что он устарел, но не предоставляет достаточно информации для обновления запроса.например,

query {
  todos { 
    id
    description
    status
    owner { 
      id
      name
    }
  }
}

и

mutation CompleteTodo {
  assignToUser(todoId: 3, userId: 12) { 
    todo { 
      id
      owner {
        id
      }
    }
  }
}

Пример результата:

{ 
  todo: {
    id: 3,
    owner: { 
      id: 12, 
      __typename: "User"
    }, 
    __typename: "Todo"
  }
}

Представьте, что ваше приложение ранее ничего не знало о пользователе: 12.Вот что происходит

  • Кэш для Todo: 3 знает, что у него теперь есть владелец User: 12
  • Кэш для пользователя: 12 содержит только {id:12}, так как мутация не былаt вернуть поле имени
  • Запрос не может дать точную информацию для поля имени для владельца без повторного ввода (что не происходит по умолчанию).Он обновляется и возвращает data: {}

Возможные решения

  • Измените запрос на возврат мутации, чтобы включить все поля, необходимые для запроса.
  • Запустить повторное получение запроса после мутации (через refetchQueries) или другой запрос, который включает в себя все, что нужно кешу
  • обновление кеша вручную

Первый из них, вероятно, самый простой и быстрый.В документации apollo есть некоторые обсуждения этого, но я не вижу ничего, что описывало бы конкретное поведение пустых данных.

https://www.apollographql.com/docs/angular/features/cache-updates.html

Подсказка к @ clément-prévost за его комментарий, который дал подсказку:

Запросы и мутации, которые выбирают одну и ту же сущность, должны запрашивать одни и те же поля.Это способ избежать проблем с локальным кэшем.

0 голосов
/ 11 сентября 2018

После изменения fetchPolicy на cache-and-network. Это решило проблему. Ссылка на документацию fetchPolicy

Для этого мне также пришлось выполнить запрос на повторную проверку.

...