Как обойти предупреждение «Отсутствует поле» при выполнении мутации с optimiticResponse в apollo-клиенте? - PullRequest
0 голосов
/ 08 октября 2019

Я использую aws-appsync с клиентом apollo, и когда я пытаюсь выполнить мутацию без предоставления всех полей, я получаю предупреждение типа «Отсутствует поле x в {...}». Мне действительно нужно предоставить все (включая необязательные) поля? Как я могу справиться с этим изящно?

Интересно, это ожидаемое поведение или нет, я упускаю что-то очевидное. Я не хочу поддерживать дополнительную сложность необходимости передавать все необязательные поля и хранить эти поля в базе данных как нулевые значения. Я подумал, поскольку это всего лишь предупреждения, я просто проигнорирую их, но обнаружил, что обновления будут выполняться в базе данных, но тогда кэш-память не всегда будет обновляться. Иногда показывалось бы обновление, а иногда нет.

import {compose, graphql} from "react-apollo";
import gql from "graphql-tag";
import React from "react";

export const EditCard = (props) => {
        const handleSave = () => {
            props.update({
                givenName :'someGivenName',
                //middleName omitted on purpose 
                familyName :'someFamilyName',
            });
        };
    return (
        <>...more stuff here...</>
    );
};

export const card = gql`
    fragment card on Identity{
        givenName
        middleName
        familyName
    }
`;

export const CardsGraphQL = gql`
    query GerCards {
        cards: listIdentitys(filter: {type: {eq: "CARD"}}) {
            items {
                ...card
            }
        }
    }
    ${card}
`;

export const UpdateCardGraphQL = gql`
    mutation UpdateCard($input: UpdateIdentityInput!) {
        updateObject: updateIdentity(input: $input) {
            ...card
        }
    }
    ${card}
`;


export const selectConfig = () => {
    return {
        options: {
            fetchPolicy: 'cache-and-network',
        },
        props: (props) => {
            return {
                cards: props.data.cards ? props.data.cards.items : [],
            };
        },
    };
};

export const updateConfig = (query) => {
    return {
        options: {
            update: (cache, {data: {updateObject}}) => {

                // Read query from cache
                const data = cache.readQuery({query});

                // Add updated object to the cache
                data.cards.items = data.cards.items.map(item => item.id === updateObject.id ? updateObject : item);

                //Overwrite the cache with the new results
                cache.writeQuery({query, data});

            },
        },
        props: (props) => {
            return {
                update: (input) => {
                    props.mutate({
                        variables: {input},
                        optimisticResponse: () => ({
                            updateObject: input,
                        }),
                    });
                },
            };
        },
    };
};

export default compose(
    graphql(CardsGraphQL, selectConfig),
    graphql(UpdateCardGraphQL, updateConfig(CardsGraphQL)))
(EditCard);



Для GraphQL эта мутация, кажется, работает без проблем, и я ожидаю получить результат в DynamoDB:

{данное имя: 'someGivenName ', familyName:' someFamilyName '}

Однако кэш не всегда обновляется результатом мутации, и клиент apollo отображает предупреждение:

"Отсутствует поле middleName в {... "

Если я добавлю поле middleName, предупреждение исчезнет, ​​и кэш обновится правильно, но результат в DynamoDB будет:

{GivenName: 'someGivenName', middleName: null, familyName:'someFamilyName'}

Этот подход приводит к дополнительной сложности в моем клиенте, которую я бы не хотел поддерживать.

У кого-нибудь еще есть эта проблема? Как решить это изящно?

Любая помощь приветствуется.

...