返回还具有字段解析器的Appsync GraphQL类型

时间:2018-08-29 17:30:59

标签: amazon-dynamodb graphql aws-appsync

我想从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返回该值,则一切正常。但是这些似乎有点多余。

有更好的方法吗?

1 个答案:

答案 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中的方式?这似乎增加了很多复杂性,您可以避免这种复杂性。