我尝试包括在以下graphql模式中定义的嵌套类型:
type User {
id: String!
posts: [Post]
}
type Post {
id: String!
}
type Query {
getUser(id: String!): User
getPost(id: String!): Post
}
正如你所看到的,一个用户有多个帖子。我将AppSync与相邻列表Dynamodb表(其中包含User和Post相关行(一起用作数据源。在AppSync中,我必须使用请求映射模板,但在阅读文档后,我不明白嵌套类型是如何解析的?
我可以想象,在查询getUser
时,应该使用User_id调用Post解析器。如果是,我如何访问后解析程序中的父id?${context.source}
就是在这里产生的吗?
由于getPost
查询解析器与由getUserPost子级调用的Post解析器相同,我是否必须将一些逻辑与解析器的请求模板集成以处理这两种情况?
举个例子会很有帮助!
您还必须为User.posts编写一个解析程序。当您调用Query.getUser
时,它的解析程序将被调用,然后如果您有User.post的解析程序,它将被${context.source}
中第一个解析程序集的上下文调用。
不幸的是,我手头没有一个干净的例子,但如果你使用CloudFormation,你最终会得到两个类似的解析器:
UserResolver:
Type: "AWS::AppSync::Resolver"
DependsOn: Schema
Properties:
ApiId: !Ref YourApiId
TypeName: Query
FieldName: getUser
DataSourceName: !Ref YourDataSource
RequestMappingTemplate: # you already have this
ResponseMappingTemplate: ...
UserPostsResolver:
Type: "AWS::AppSync::Resolver"
DependsOn: Schema
Properties:
ApiId: !Ref YourApiId
TypeName: User
FieldName: posts
DataSourceName: !Ref YourDataSource
RequestMappingTemplate: |
# use context.source.id here to reference the user id
ResponseMappingTemplate: "$util.toJson($ctx.result.items)"
基本上就是这样。你走在了正确的轨道上,但从字段到解析器的映射需要比你想象的更明确。
这里是另一篇stackoverflow文章,我在其中详细描述了如何做到这一点。标题说突变,但它涵盖了突变和查询。在AWS AppSync 上创建关系的突变