Ошибка хранилища: приложение попыталось записать объект без указанного имени типа, но хранилище уже содержит объект - PullRequest
0 голосов
/ 11 января 2020

После мутации, когда я обновляю кеш, изменения отражаются в пользовательском интерфейсе, но появляется следующая ошибка:

Нарушение инварианта: ошибка хранилища: приложение попыталось записать объект без указанного имени типа, но хранилище уже содержит объект с именем типа ItemCodeConnection для объекта с идентификатором $ ROOT_QUERY.itemCodes ({"filter": {"number": 10000001}}). Элемент selectionSet, который пытался записать: {"kind": "Field", "name": {"kind": "Name", "value": "itemCodes"}, "arguments": [{"kind" : "Аргумент", "название": { "вид": "название", "значение": "фильтр"}, "значение": { "вид": "Переменная", "название": { "вид":» Имя " "значение": "фильтр"}}}], "директивы": [], "selectionSet": { "вид": "SelectionSet", "выбор": [{ "вид": "поле"," название ": {" вид ":" имя " "значение": "itemCodes"}, "аргументы": [], "директива": [], "selectionSet": { "добрые": "SelectionSet"," Выборки ": [{" вид ":" FragmentSpread», "название": { "вид": "Name", "значение": "itemCodeTile"}, "директивы": []}, { "вид": "поле" , "название": { "вид": "название", "значение": "__ Ьурепат"}}]}}, { "вид": "поле", "название": { "вид": "название",» значение ":" __ typename "}}]}}

Запрос GraphQL:

const CREATE_ITEM_CODE_SPEC = gql`
mutation createItemCodeSpec($input: createItemCodeSpecInput) {
    createItemCodeSpecification(input: $input){
        __typename
        id
        itemCode {
            number
        }
        product
        spec_class
        grade
    }
}
`

const GET_ITEM_CODE  = gql`
    query itemCode($filter: filterInput){
        itemCodes(filter: $filter){
            itemCodes {
                number
                type
                description
                group 
                item_code_spec {
                    id
                    itemCode {
                        number
                    }
                product
                spec_class
                grade
           }
             created_on
             created_by
             changed_on
             changed_by      
            }
        }
    }
`

Ниже приведена мутация:

const [mutation, { data, loading, error}] = useMutation(
        CREATE_ITEM_CODE_SPEC,
        {
            update(cache, { data: { createItemCodeSpecification } }){
                const currentData  = cache.readQuery({
                    query: GET_ITEM_CODE,
                    variables: { filter : {number:itemCode} } 
                })
                cache.writeQuery({
                    query: GET_ITEM_CODE,
                    variables: { filter : {number:itemCode} },
                    data: {
                        ...currentData,
                        itemCodes: {
                            itemCodes: currentData.itemCodes.itemCodes.map((itemCode, index) => {
                                return {
                                    ...itemCode,
                                    item_code_spec: index === 0? [
                                        ...itemCode.item_code_spec,
                                        createItemCodeSpecification
                                     ] : itemCode.item_code_spec
                                }
                            })
                        }
                    }
                }) 
            }
        }
        );

1 Ответ

0 голосов
/ 11 января 2020

В вашей ответной мутации отсутствуют поля.

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

Вот почему Рекомендуется использовать фрагменты для совместного использования полей среди всех связанных запросов и мутаций.

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

Посмотрите здесь, чтобы увидеть подробнее о том, как работают обновления кэша: https://medium.com/free-code-camp/how-to-update-the-apollo-clients-cache-after-a-mutation-79a0df79b840

...