Я использую 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'}
Этот подход приводит к дополнительной сложности в моем клиенте, которую я бы не хотел поддерживать.
У кого-нибудь еще есть эта проблема? Как решить это изящно?
Любая помощь приветствуется.