我想从AddImageSet突变返回ImageSet类型。但是我似乎无法执行此操作,因为ImageSet类型上的每个字段都有其自己的解析器,该解析器将覆盖解析器映射模板。
模式:
type ImageSet {
SetKey: ID
SetName: String
SetCreatedAt: AWSTimestamp
SetDescription: String
SetTags: [Tag]
}
type Mutation {
AddImageSet(setName: String!, setDescription: String): ImageSet
}
这是突变:
{
"version" : "2017-02-28",
"operation" : "PutItem",
"key" : {
"PartitionKey" : { "S" : "ImageSet" },
"SortKey" : { "S" : "ImageSet-$util.autoId()" }
},
"attributeValues" : {
"Name": { "S" : "${context.arguments.setName}" },
"Description": { "S" : "${context.arguments.setDescription}" },
"CreatedAt": { "N" : $util.time.nowEpochSeconds() },
}
}
和响应映射模板
{
"SetKey" : "$context.result.SortKey",
"SetName" : "$context.result.Name",
"SetCreatedAt" : $context.result.CreatedAt,
"SetDescription" : "$context.result.Description"
}
运行此命令时,AddImageSet突变返回的对象的每个字段都设置为null,因为字段解析器将覆盖AddImageSet突变的响应映射模板。
我已经通过创建重复的“ ImageSetResult”类型解决了这一问题,只是没有将解析器附加到该字段。然后,如果AddImageSet Mutation返回该值,则一切正常。但是这些似乎有点多余。
有更好的方法吗?
答案 0 :(得分:2)
这是GraphQL中的预期行为。如果您在 ImageSet.SetKey 上有一个解析器,并且您的 Mutation.AddImageSet 突变返回一个类型为 ImageSet 的对象,则该对象将列在其中的每个字段选择集将被调用。 Mutation.AddImageSet 返回的值将被子解析器返回的任何值覆盖。
要添加更多上下文,从 Mutation.AddImageSet 响应映射模板返回的值将是 $ ctx.source 的值。 ImageSet.SetKey / SetName / SetCreatedAt 解析器。在这些解析器中,您可以执行以下操作:
#if( $ctx.source.SetKey ) "$ctx.source.SetKey" #else .. whatever SetKey does .. #end
是否有理由需要SetKey / SetName / etc上的解析器?如果 Mutation.AddImageSet 或 Query.AddImageSet 等已经返回了对象,则不需要该类型的解析器。
另一个说明。您是否有理由想要名称 ImageSet.SetName ,而不只是 ImageSet.Name ,这就是将其存储在DynamoDB中的方式?这似乎增加了很多复杂性,您可以避免这种复杂性。