Amazon web services 如何配置Appsync从HTTP端点检索数据以填充列表?
我有两个http端点设置:Amazon web services 如何配置Appsync从HTTP端点检索数据以填充列表?,amazon-web-services,graphql,aws-api-gateway,aws-appsync,vtl,Amazon Web Services,Graphql,Aws Api Gateway,Aws Appsync,Vtl,我有两个http端点设置: GET /users/{userId} GET /users/{userId}/notes/{noteId} GET用户返回一个有效负载,其中包括多个noteIds的列表,可用于向GET Note端点发出多个请求 我试图将Appsync配置为能够在一个查询中获取所有这些数据,但无法使用对象填充列表 模式: type Query { getUser(userId: String!): User getNote(userId: String!, noteId:
GET /users/{userId}
GET /users/{userId}/notes/{noteId}
GET用户返回一个有效负载,其中包括多个noteId
s的列表,可用于向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!
}
我为每个端点都设置了一个数据源,我有一个用于getUser
和getNote
的解析器-我还有一个用于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
field resolver)端点的我的解析器如下所示:
{
"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?(我可以在端点上的自定义授权器中看到这一点,它注销了方法ARN,其中仍然包括$ctx.args…
感觉这是一个常见的用例,但我在任何地方都找不到解决方案或示例。我的方法正确吗,或者我需要其他解决方案吗?我认为第一个问题是您的
用户。注意解析程序以及如何访问用户ID
和注释ID
。当您有字段解析程序时,应该使用ctx.source
以访问父字段。例如,您应该在User.notes
字段解析程序中使用ctx.source.userId
其次,当您要从getNote
HTTP端点获取单个注释时,当使用BatchInvoke
通过AWS Lambda代理时,AppSync支持这种类型的行为。请参阅链接上的“高级用例:批处理”以获得更好的想法。此外,我认为这与您的用例相关
另一种可能是使用另一个HTTP端点同时获取所有用户的笔记,但我不确定这在您的情况下是否可行。我可以知道您是如何从getUser
调用getNote
的吗?嗨@Myz,我的问题中没有提到这一点-我现在已经更新了它。我有一个字段解析器,指向相同的映射这是getNote解析器。感谢@Myz的回答。我以前没有考虑过使用Lambda解析器,但我认为这是正确的方法。新的HTTP端点似乎与我使用graphql(将微服务与前端逻辑分离)的理由背道而驰。