Return 突变的值为空 and/or 未定义
Return value from mutation is empty and/or undefined
当运行一个使用apollo-link状态的@client突变时,解析器的响应仅仅是:
{ data: {}, errors: undefined }
我正在 return 来自解析器
{data: { ...product }}
。
其中产品是具有多个值的对象,其中一个
__typename
.
我尝试将 return 值设置为各种值,例如
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))
}
首先:对于这么长的代码块,我深表歉意。
上面代码的预期结果是解析器 return 刚刚添加的产品,比如
{ data: {...product}, errors: undefined }
,而是 returns
{ data: {}, errors: undefined }
如开头所述。
如果您需要更多信息,或者我遗漏了什么,请告诉我。
const UPDATE_ITEM = gql
mutation updateInventoryItem($product: InventoryItem!) {
return updateInventoryItem(product: $product) @client {
__typename
id
...and so on
}
}
;
这个函数当然需要 return 一个值,但这不是全部。
GraphQL(在本例中为 Apollo-Client),需要一个像响应一样形成的对象,你告诉它你想要的。
在这种情况下:
updateInventoryItem(product: $product) @client {
__typename
id
...and so on
}
这会要求获得一个带有 __typename 和 id 的对象,以及您放入其中的任何其他内容。
所以总而言之,我犯了一个愚蠢的错误,但由于没有答案,如果有人和我一样掉进同样的坑,这里有一些东西可以尝试。
当运行一个使用apollo-link状态的@client突变时,解析器的响应仅仅是:
{ data: {}, errors: undefined }
我正在 return 来自解析器
{data: { ...product }}
。
其中产品是具有多个值的对象,其中一个
__typename
.
我尝试将 return 值设置为各种值,例如
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))
}
首先:对于这么长的代码块,我深表歉意。
上面代码的预期结果是解析器 return 刚刚添加的产品,比如
{ data: {...product}, errors: undefined }
,而是 returns
{ data: {}, errors: undefined }
如开头所述。
如果您需要更多信息,或者我遗漏了什么,请告诉我。
const UPDATE_ITEM = gql
mutation updateInventoryItem($product: InventoryItem!) {
return updateInventoryItem(product: $product) @client {
__typename
id
...and so on
}
}
;
这个函数当然需要 return 一个值,但这不是全部。
GraphQL(在本例中为 Apollo-Client),需要一个像响应一样形成的对象,你告诉它你想要的。
在这种情况下:
updateInventoryItem(product: $product) @client {
__typename
id
...and so on
}
这会要求获得一个带有 __typename 和 id 的对象,以及您放入其中的任何其他内容。
所以总而言之,我犯了一个愚蠢的错误,但由于没有答案,如果有人和我一样掉进同样的坑,这里有一些东西可以尝试。