【问题标题】:AppSync: Nested Type ResolverAppSync:嵌套类型解析器
【发布时间】:2018-12-22 20:41:15
【问题描述】:

我尝试包含在以下 graphql 架构中定义的嵌套类型:

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

type Post {
  id: String!
}

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

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

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

由于getPost 查询解析器与由 getUser Post 子调用的 Post 解析器相同,我是否必须将一些逻辑与解析器的请求模板集成以处理这两种情况?

举个例子真的很有帮助!

【问题讨论】:

  • 我一直在努力为同一个问题找到一个体面的答案,终于找到了this Medium 帖子,最后它很好地解释了如何在嵌套的 JSON 对象中检索数据。跨度>

标签: amazon-dynamodb graphql velocity aws-appsync


【解决方案1】:

您还必须为 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)"

差不多就是这样。您在正确的轨道上,但从字段到解析器的映射需要比您想象的更明确。

【讨论】:

  • 谢谢。除了对包含父级结果的上下文对象的模糊引用之外,我无法在文档中找到它(我想我错过了它,因为没有这样的嵌套示例)。我现在意识到我错误地假设解析器仅在 Query 或 Mutation 类型中指定,而忽略了它们可以在任何地方指定,这是标准的 graphQL。再次感谢!
  • 很高兴它有帮助,@FrancisUpton。我发现文档也有点难以浏览,我们也花了一段时间才弄清楚如何做到这一点。
  • @macbutch 我不知道。我可以将它与 Amplify 一起使用并手动编辑 JSON 模板吗? (注意我使用的不是 DynamoDB,而是 RDS)。非常感谢。
  • 如果帖子分页了怎么办?谢谢
  • @Ricardo 可能为时已晚,无法提供帮助,但我们没有使用 Amplify,所以我不确定,但我不认为这会是个问题。分页细节会根据您的后端有所不同,但我推荐graphql docs on pagination。我们在 Dynamo 中使用 Connection 类型,基本方法也应该适合您(尽管我希望它看起来有点不同)。
【解决方案2】:

这是另一个 stackoverflow 帖子,我详细描述了如何执行此操作。标题说突变,但它涵盖了突变和查询。 mutation to create relations on AWS AppSync

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 2022-07-04
    • 2019-08-28
    • 2018-04-17
    • 2021-07-18
    • 2021-04-21
    • 2019-03-23
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多