我正在使用AWS Appsync,我想从成功执行的突变中获得响应。当我在Appsync Graphql控制台中尝试设置时,得到的是"data": { "mutateMeeting" }
响应:
当我在react应用程序中尝试相同的操作时,我在dynamodb数据库中看到发生了突变,但是 react-apollo 不会返回突变响应。如您在apollo开发工具中所见,"data": { "mutateMeeting" }
为空:
我想念什么?
对应的 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标签突变的内容为:
import gql from 'graphql-tag'
export default gql`
mutation mutateMeeting($companyId: String!, $meeting: MeetingInput!) {
mutateMeeting(companyId: $companyId, meeting: $meeting) {
id,
start,
end
}
}
`
和反应阿波罗的幻觉由以下方式给出:
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)
应用同步请求
#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"
}
答案 0 :(得分:1)
该错误here似乎有一个未解决的问题。 this original issue中还有其他详细信息。
SessionQuery中的用户信息将首先被UserProfile组件缓存并监视。当UpdateAvatarMutation执行并返回时,UserProfile组件中的查询将接收空数据。其他几个人也观察到了此行为,并且都将其追溯到查询/缓存的字段与突变返回的字段之间的不完美重叠(在此示例中,突变返回结果的“用户”节点中缺少电子邮件。
换句话说,如果您有一个返回相同类型对象的查询,并且该查询和该突变之间的字段不匹配,则可能会得到空数据。这不是预期的行为,但是如果在这种情况下这是潜在的问题,则可以尝试确保查询和变异的请求字段相同。
答案 1 :(得分:0)
在我的情况下,我必须在突变中编写一个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 - Strange Effect When Making Mutation?