微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从python lambda返回graphql Union到AWS Appsync? 示例示例

如何解决如何从python lambda返回graphql Union到AWS Appsync? 示例示例

是否可以通过python lambda用graphql Union进行响应?怎么样? It seems possible,但我无法超越。

我包含一个__typename属性,但是大多数时候我都会收到此错误

{'errorType': 'BadRequestException','message': "Could not determine the exact type of MealMix. Missing __typename key on value.'"}

MealMix是我的联合,其架构类似于:

type Meal { name: String }
type OtherMeal { name: String }
union MealMix = Meal | OtherMeal
type Query {
    GetMealMix(identity_id: ID!,date: AWSDate!): [MealMix]
}

查询是:

        query test_query {
            GetMealMix(identity_id: "this",date: "2020-11-20") {
                ... on Meal {name}
                ... on OtherMeal {name}
            }
        }

我从lambda返回:

return [{' __typename': 'Meal','name': 'Kiwifruit,Zespri Gold,Raw'},{' __typename': 'OtherMeal','name': 'The meal at the end of the universe'}]

响应模板是认模板:$util.toJson($ctx.result)

我的Google搜索似乎表明我只需要包含__typename属性,但是没有明显的Python示例可以达到这种效果。我首先要问的是,我是否正在鞭打一匹死马(这意味着这没有实现并且永远不会起作用),其次,如果它起作用了,究竟如何?

解决方法

问题

一方面,我发现了一些示例,其中您可能需要将__typename包含在查询中。 另一方面,这也非常有趣,因为AWS文档没有提及在查询中包含__typename,但确实提到了接口的使用,因此我想知道这是否是使事情正常运行的关键,所有类型都可以扩展相同的界面。

解决方案

选项1

尝试在__typenameMeal片段中包含OtherMeal(您在查询中提到使用__typename,但不确定将其放置在何处)。

示例

query test_query {
            GetMealMix(date: "2020-11-20") {
                ... on Meal {
                    __typename
                    name
                }
                ... on OtherMeal {
                    __typename                    
                    name
                }
            }
        }

选项2

union中包含的所有类型都使用相同的接口,正如您在共享文档的标题为“类型解析示例”的部分中所展示的那样

示例

interface MealInterface { name: String }
type Meal implements MealInterface { name: String }
type OtherMeal implements MealInterface { name: String }

注释

硬编码响应

您返回了一个硬编码的响应,但是我不确定是否需要其他元数据来处理AWS Lambda上的GQL响应。尝试记录响应以确定是否包含__typename。如果不包括__typename,请考虑将typename添加到id并使用您共享的AWS文档中建议的转换:

#foreach ($result in $context.result)
    ## Extract type name from the id field.
    #set( $typeName = $result.id.split("-")[0] )
    #set( $ignore = $result.put("__typename",$typeName))
#end
$util.toJson($context.result)

identity_id

此外,由于GraphQL处理ID类型的方式,“ identity_id”参数中的“ this”可能会导致缓存问题(请参见:https://graphql.org/learn/schema/#scalar-types

参考

AWS上的

GraphQL __typename查询示例:https://github.com/LambdaSharp/AppSync-Challenge GraphQL标量类型:https://graphql.org/learn/schema/#scalar-types

,

您可以按照以下方式编写。 它应该为您工作。

schema {
    query: Query
}

type Query {
    GetMealMix(identity_id: ID!,date: AWSDate!): [MealMix]
}

union MealMix = Meal | OtherMeal

type Meal {
    name: String
}

type OtherMeal {
    name: String
}

query {
    GetMealMix(identity_id: "this",date: "2020-11-20") {
        ... on Meal {name}
        ... on OtherMeal {name}
    }
}

您可以从以下网址获取参考: Interfaces and unions in GraphQL

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。