React-Apollo Mutation возвращает пустой ответ

Я использую AWS Appsync, где хочу получить ответ от успешно выполненной мутации. Когда я пытаюсь выполнить настройку в консоли Appsync Graphql, я получаю заполненный ответ "data": { "mutateMeeting" }:  Appsync mutation

Когда я пробую то же самое в своем приложении реакции, я вижу в базе данных Dynamodb, что мутации происходят, но react-apollo не возвращает ответ мутации. Как вы можете видеть в инструменте разработки apollo, "data": { "mutateMeeting" } имеет значение null: < img src = "https://i.stack.imgur.com/LxHvW.png" alt = "введите описание изображения здесь">

Что мне не хватает?

Соответствующая схема graphql гласит:

input MeetingInput {
  id: String,
  start: String!,
  end: String!,
  agreements: [AgreementInput]!
}

type Meeting {
  id: String!
  start: String!
  end: String!
  agreements: [Agreement]
}

type Mutation { 
  mutateMeeting (
    companyId: String!,
    meeting: MeetingInput!
  ): Meeting!
}

мутация graphql-tag гласит:

import gql from 'graphql-tag'

export default gql`
  mutation mutateMeeting($companyId: String!, $meeting: MeetingInput!) {
    mutateMeeting(companyId: $companyId, meeting: $meeting) {
      id,
      start,
      end
    }
  }
`

а инклюзия react-apollo задается следующим образом:

import React, { Component } from 'react'
// antd
import { Spin } from 'antd'
// graphql
import { compose, graphql } from 'react-apollo'
import mutateMeeting from '../queries/mutateMeeting'

class MeetingStatus extends Component {
  componentDidMount() {
    const { mutateMeeting, meeting } = this.props
    console.log(meeting)
    const variables = {
      companyId: meeting.company.id,
      meeting: {
        start: meeting.start.toISOString(),
        end: meeting.end.toISOString(),
        agreements: meeting.agreements,
      }
    }
    console.log(variables)

    mutateMeeting({
      variables
    }).then(({data}) => console.log('got data', data))
    .catch(err => console.log(err))
  }

  render() {
    console.log(this.props)
    return <div>convocado</div>
  }
}

const MeetingStatusWithInfo = compose(
  graphql(mutateMeeting, { name: 'mutateMeeting' })
)(MeetingStatus)

export default (MeetingStatusWithInfo)

Запрос Appsync

#set($uuid = $util.autoId())
#set($batchData = [])
#set( $meeting = ${context.arguments.meeting} )

## Company
#set( $meetingMap = {
  "PK" : $context.arguments.companyId,
  "SK" : "Meeting-$uuid",
  "start" : $meeting.start,
  "end" : $meeting.end
} )
$util.qr($batchData.add($util.dynamodb.toMapValues($meetingMap)))

## Meeting
$util.qr($meetingMap.put("PK", $meetingMap.SK))
$util.qr($batchData.add($util.dynamodb.toMapValues($meetingMap)))

## Agreements
#foreach($agreement in $meeting.agreements)
  #set( $agreementId = $util.autoId())
  #set( $agreementMap = {
    "PK" : $meetingMap.SK,
    "SK" : "Agreement-$agreementId",
    "name" : $agreement.name
  } )

  $util.qr($batchData.add($util.dynamodb.toMapValues($agreementMap)))
#end

{
  "version" : "2018-05-29",
  "operation" : "BatchPutItem",
  "tables": {
    "Vysae": $utils.toJson($batchData)
  }
}

Ответ Appsync:

#set( $meeting = $context.result.data.Vysae[1] )
{
  "id": "$meeting.PK",
  "start": "$meeting.start",
  "end": "$meeting.end"
}

person Knowledge    schedule 20.08.2018    source источник
comment
Не могли бы вы предоставить свои резолверы? Поскольку они могут неправильно возвращать информацию с ожидаемыми именами свойств в правильном вложении, вам также может потребоваться запустить обновление или updateQueries на клиенте после возврата данных.   -  person Benjamin Charais    schedule 20.08.2018
comment
Я посмотрю на функциональность обновления и добавлю резолверы;)   -  person Knowledge    schedule 20.08.2018
comment
Самый быстрый старт будет здесь: apollographql.com/docs/react/essentials /mutations.html#update   -  person Benjamin Charais    schedule 20.08.2018
comment
@BenjaminCharais из упомянутых вами функций обновления предназначена для обновления кеша. Мне нужен идентификатор, созданный моим распознавателем запросов, в качестве ответа на мутацию.   -  person Knowledge    schedule 21.08.2018
comment
Я неправильно понял, но где же ваши преобразователи, потому что, если вы передаете от них соответствующую информацию, то ответ от мутации будет соответствующим образом отображаться на запрос. Я могу добавить ответ на .... фиктивные данные из потока информации.   -  person Benjamin Charais    schedule 21.08.2018
comment
У меня такая же проблема. Если кто-нибудь может взглянуть на мой пост: stackoverflow.com/questions/52789125/ Это мне очень поможет   -  person Z_z_Z    schedule 13.10.2018


Ответы (2)


Похоже, здесь есть открытая проблема с этой ошибкой, здесь. Также есть дополнительные сведения в этом исходном выпуске.

Информация о пользователе в SessionQuery изначально будет кэшироваться и отслеживаться компонентом UserProfile. Когда UpdateAvatarMutation выполняется и возвращается, запрос в компоненте UserProfile получит пустые данные. Несколько других также наблюдали это поведение и все проследили его до несовершенного перекрытия между запрашиваемыми / кэшированными полями и полями, возвращаемыми при мутации (в этом примере электронная почта отсутствует в узле User в возвращаемых результатах мутации.

Другими словами, если у вас есть запрос, который возвращает тот же тип объекта, и есть несоответствие в полях между запросом и мутацией, возможно, вы получите нулевые данные. Это не ожидаемое поведение, но если это основная проблема в данном случае, вы можете попытаться убедиться, что запрошенные поля совпадают как для вашего запроса, так и для мутации.

person Daniel Rearden    schedule 13.10.2018

В моем случае мне пришлось написать update функцию в мутации, чтобы вернуть данные.

Попробуйте изменить свою мутацию на это и посмотрите в консоль, чтобы увидеть, изменится ли что-нибудь:

mutateMeeting({
  variables,
  update: (proxy, {data: {mutateMeeting}}) => {
     console.log("Update: ", mutateMeeting);
  }
}).then(({data}) => console.log('got data', data))
  .catch(err => console.log(err))
}

Функция update может быть вызвана несколько раз, но в конечном итоге вы должны увидеть, что ваши данные возвращаются так, как вы этого ожидаете.

Это то, что у меня сработало. Если хотите, можете взглянуть на мой вопрос и посмотреть, поможет ли это: React Apollo - Странный эффект при мутации?

person Z_z_Z    schedule 13.10.2018