突变的返回值为空和/或未定义

时间:2019-01-09 15:06:09

标签: react-apollo apollo-client apollo-link-state

使用apollo-link-state运行@client变异时,解析器的响应只是:

{ 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 个答案:

答案 0 :(得分: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和其他任何内容的对象。

总而言之,我这是一个愚蠢的错误,但是由于没有答案,如果有人和我一样陷入同样的​​困境,那么可以尝试一下。