如何将graphql联合从python lambda返回到AWS appsync?

2024-09-30 20:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

可以从python lambda用graphqlUnion响应吗?怎么做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)

我的谷歌搜索似乎表明我只需要包含__typename属性,但是没有明确的Python示例可以做到这一点。我首先要问的是,我是不是在鞭打一匹死马(这意味着这没有实现,也永远不会起作用),第二,如果它真的起作用,具体如何


Tags: ofthelambdanameidstring属性on
2条回答

你可以这样写,如下所示。 它应该对你有用

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}
    }
}

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

问题

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

解决方案

选择1

尝试将__typename包含在MealOtherMeal片段中(您提到在查询中使用__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。如果不包含^ {CD1>},请考虑在ID中添加Type名称,并使用您共享的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”参数中的“this”可能由于GraphQL处理id类型的方式而导致缓存问题(请参见:https://graphql.org/learn/schema/#scalar-types

参考资料

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

相关问题 更多 >