Возвращаемое значение от мутации пустое и / или неопределенное
При запуске мутации @client с использованием apollo-link-state, ответ от распознавателя просто:
{ data: {}, errors: undefined }
Из резольвера я возвращаюсь {data: { ...product }}
, Где продукт является объектом с несколькими значениями, среди которых __typename
,
Я попытался установить возвращаемое значение для всех видов значений, таких как return product
, return { data: product }
, return { data: { data: {
product }}}
и т.д. и т.п., я думаю, вы поняли идею.
Резольвер:
export const updateInventoryItem = async (product, cache) => {
const query = gql
query {
inventory @client {
...omitted, but all the values
}
};
const prevState = await cache.readQuery({ query });
const prevInventory = prevState.inventory;
const productIndex = prevInventory.findIndex(x => x.id ===
product.id);
prevInventory.splice(productIndex, 1);
const data = {
inventory: [
product,
...prevInventory
]
}
await cache.writeQuery({ query, data });
return {data: { ...product }}
}
Мутация:
const UPDATE_ITEM = gql
mutation updateInventoryItem($product: InventoryItem!) {
updateInventoryItem(product: $product) @client {
__typename
id
...and so on
}
}
;
Функция, которая вызывает мутацию:
updateItem = () => {
this.props.updateItem({
variables: {
product: {
__typename: this.state.item.__typename,
id: this.state.item.id,
addedToCart: this.state.item.addedToCart,
...and so on
}
}
}).then((e) => {
console.log(e);
this.setState({ savedRecently: true })
},
err => console.log(err))
}
Во-первых: я извиняюсь за ужасно длинный блок кода, который нужно пахать.
Ожидаемый результат кода выше, для решателя, чтобы возвратить только что добавленный продукт, как { data: {...product}, errors: undefined }
, но вместо этого он возвращает { data: {}, errors: undefined }
как указано в начале.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или я что-то пропустил.
1 ответ
const UPDATE_ITEM = gql
mutation updateInventoryItem($product: InventoryItem!) {
return updateInventoryItem(product: $product) @client {
__typename
id
...and so on
}
}
;
Эта функция, конечно, должна возвращать значение, но это еще не все.
GraphQL (в данном случае Apollo-Client) ожидает объект, сформированный как ответ, вы говорите, что хотите.
В этом случае:
updateInventoryItem(product: $product) @client {
__typename
id
...and so on
}
При этом требуется получить объект с __typename, id и всем остальным, что вы туда поместите.
В общем, глупая ошибка с моей стороны, но так как нет ответов, если кто-то упадет в ту же яму, что и я, вот что попробовать.