AppSync:嵌套类型解析器

20

我尝试包含在以下GraphQL模式中定义的嵌套类型:

type User {
  id: String!
  posts: [Post]
}

type Post {
  id: String!
}

type Query {
  getUser(id: String!): User
  getPost(id: String!): Post
}

如您所见,一个用户有多个帖子。我正在使用AppSync和相邻列表Dynamodb表(其中包含用户和相关帖子的行)作为数据源。在AppSync中,我必须使用请求映射模板,但阅读文档后我不明白嵌套类型是如何解析的?

我想象一下,在查询getUser时应该使用User_id调用Post解析器。如果是这样,我该如何访问帖子解析器中的父ID?这就是${context.source}的使用场景吗?

由于getPost查询解析器与Post解析器相同,并且由getUser Post child调用,因此我是否需要在解析器的请求模板中集成一些逻辑来处理两种情况?

一个示例会非常有帮助!


1
我曾经苦苦寻找一个像样的答案来回答同样的问题,最终在这篇 Medium文章中找到了答案。在文章末尾,它非常清楚地解释了如何检索嵌套JSON对象中的数据。 - Cris69
2个回答

26

你还需要编写一个 User.posts 的解析器。当你调用 Query.getUser 时,它的解析器将被调用,如果你有一个 User.posts 的解析器,它将使用第一个解析器中的上下文在 ${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)"

大致就是这样。你走在正确的道路上,但字段到解析器的映射需要比你想象的更加明确。


2
谢谢您。我在文档中找不到这个(我认为是因为没有像这样的嵌套示例),除了一个含糊的参考,指出上下文对象包含父级结果。现在我意识到我错误地假设解析器仅在查询或变异类型中指定,并忽略了它们可以在任何地方指定,这是标准的GraphQL。再次感谢! - Francis Upton IV
3
感谢你的帮助,@FrancisUpton。我发现这些文档有些难以导航,我们也花了一段时间才弄明白如何做到这一点。 - macbutch
@macbutch,我不知道这个。我能在手动编辑JSON模板的情况下与Amplify一起使用吗?(请注意,我没有使用DynamoDB,而是RDS)。非常感谢。 - Ricardo
如果文章被分页了呢?谢谢。 - Ricardo
1
@Ricardo 可能已经太晚了,但我们没有使用 Amplify,所以我不确定,但我认为这不会是一个问题。分页细节会根据您的后端略有不同,但我建议查看 graphql 分页文档。我们在 Dynamo 中使用 Connection 类型,基本方法也适用于您(尽管我希望它看起来有些不同)。 - macbutch
谢谢您的这篇文章。我试图花了几个小时来解决如何处理嵌套对象的问题... - TorbenVerdorben

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接