如何配置 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 端点检索数据以填充列表?的主要内容,如果未能解决你的问题,请参考以下文章