Возвращаемое значение от мутации пустое и / или неопределенное - PullRequest
0 голосов
/ 09 января 2019

При запуске мутации @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 Ответ

0 голосов
/ 01 февраля 2019
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 и всем остальным, что вы там поместили.

В общем, глупая ошибка с моей стороны, но поскольку ответов нет, если кто-нибудь упадет в ту же яму, что и я, вот что можно попробовать.

...