如何解决如何从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
尝试在__typename
和Meal
片段中包含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 举报,一经查实,本站将立刻删除。