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 的对象,以及您放入其中的任何其他内容。

所以总而言之,我犯了一个愚蠢的错误,但由于没有答案,如果有人和我一样掉进同样的坑,这里有一些东西可以尝试。