如何配置 Appsync 以从 HTTP 端点检索数据以填充列表?

Posted

技术标签:

【中文标题】如何配置 Appsync 以从 HTTP 端点检索数据以填充列表?【英文标题】:How to configure Appsync to retrieve data from a HTTP endpoint to populate a list? 【发布时间】:2021-03-18 15:28:47 【问题描述】:

我有两个 http 端点设置:

GET /users/userId
GET /users/userId/notes/noteId

GET 用户返回一个负载,其中包含多个noteIds 的列表,可用于向 GET Note 端点发出多个请求。

我正在尝试将 Appsync 配置为能够在单个查询中获取所有这些数据,但我无法让列表填充对象。

架构:

type Query 
  getUser(userId: String!): User
  getNote(userId: String!, noteId: String!): Note


type User 
  userId: ID!
  firstName: String!
  lastName: String!
  notes: [Note]


type Note 
  noteId: ID!
  noteText: String!
  createdDatetime: Int!

我为每个端点设置了一个数据源,我有一个用于 getUsergetNote 的解析器 - 我还有一个用于 User.notes 的解析器,它与 getNote 相同。这些解析器具有以下响应映射:

#if($ctx.error)
  $util.error($ctx.error.message, $ctx.error.type)
#end
#if($ctx.result.statusCode == 200)
    $ctx.result.body
#else
    $utils.appendError($ctx.result.body, "$ctx.result.statusCode")
#end

我的 GET Note 解析器(包括 User.note 字段解析器)端点如下所示:


    "version": "2018-05-29",
    "method": "GET",
    "resourcePath": $util.toJson("/prod/users/$ctx.args.userId/notes/$ctx.args.noteId"),
    "params":
        "headers":
            "Content-Type": "application/json",
        
    

我可以从日志中看到,Appsync 尝试运行 GET Note 解析器,但资源路径似乎没有填充任何 ID? (我可以在端点上的自定义 Authorizer 中看到这一点,它会注销仍然包含 $ctx.args... 的方法 ARN

感觉这是一个常见的用例,但我在任何地方都找不到解决方案或示例。我的方法是否正确,还是需要其他解决方案?

【问题讨论】:

请问你是怎么从getUser打电话给getNote的? 嗨@Myz,我错过了我的问题 - 我现在已经更新了。我有一个字段解析器,它指向与 getNote 解析器相同的映射。 【参考方案1】:

我认为第一个问题是您的User.notes 解析器以及您如何访问userIdnoteId。当你有字段解析器时,你应该使用ctx.source 来访问父字段[Ref.]。例如,您应该在 User.notes 字段解析器中使用 ctx.source.userId

其次,当您要从您的 getNote HTTP 端点获取单个注释时,AppSync 在使用 BatchInvoke 通过 AWS Lambda 代理时支持这种类型的行为。请参阅this 链接上的“高级用例:批处理”以获得更好的想法。另外,我认为这个 SO post 与您的用例相关。

另一种可能性是让另一个 HTTP 端点一次获取所有用户的笔记,但我不确定这是否适用于您的情况。

【讨论】:

感谢@Myz 的回答。我之前没有考虑过使用 Lambda 解析器,但我认为这是正确的方法。一个新的 HTTP 端点似乎违背了我使用 graphql(微服务与前端逻辑分离)的推理。

以上是关于如何配置 Appsync 以从 HTTP 端点检索数据以填充列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Amplify 配置为使用多个 AppSync 端点?

如何在没有云端的情况下将 route53 放在 appsync 端点的前面?

如何将签名的 HTTP 请求从 AWS Lambda 发送到 AppSync GraphQL?

如何在 Appsync Lambda Resolver 中检索 cognito 识别数据(使用 cdk)

AppSync 和被锁定在 AWS 中的想法

如何在部署前从@aws-cdk/aws-appsync 检索 schema.graphql 文件