我有一个Appsync架构,它定义了一个用户类型,它本身包含一个Notes列表:
type User {
id: ID!
name: String!
notes: [Note]
}
type Note {
id: ID!
text: String!
}
在User
的请求映射中,我能够访问请求的头部,以访问承载令牌:
{
"version": "2018-05-29",
"method": "GET",
"resourcePath": $util.toJson("/prod/user/$ctx.args.userId"),
"params":{
"headers":{
"Content-Type": "application/json",
"Authorization": "Bearer $ctx.request.headers.Authorization",
}
}
}
这样做效果很好,并且头被传递到数据源。
User.notes
字段的解析器是Lambda解析器,它本身迭代地调用类似的APIGET /prod/user/{userId}/notes/{noteId}
。我可以使用$ctx.source...
访问父解析程序响应数据。但是,我还需要能够通过Authorization标头(例如$ctx.request.headers.Authorization
(。
我在User
响应映射中尝试过,但不起作用:
#set($results = $ctx.result.body)
#set($headers = {
"Authorization": "Bearer $ctx.request.headers.Authorization"
})
#set($results.headers = $headers)
$results
我的问题是,如何将请求标头从父解析程序传递给子解析程序?也许问这个问题的另一种方式是,如果我在Graphql请求头上有一个Bearer令牌,我如何确保它总是被传递给任何被调用的解析器?
@Myz在评论中提到,解决方案是使用管道解析程序。
最后,我将头推送到$ctx.stash
对象中(管道解析程序中的所有函数都可以使用该对象(——我使用:
$util.qr($ctx.stash.put("bearerToken", "Bearer $ctx.request.headers.Authorization"))
然后,我可以使用:"$ctx.stash.bearerToken"
在每个函数(即子解析器(中访问该值
添加注释user_id
type Note {
id: ID!
user_id: ID!
text: String!
}
并解析为notes:[ctx.source.id的[Note]在这个应用程序之后
{
"version": "2018-05-29",
"statements": [
"select * from notes where user_id = '$ctx.source.id'"
]
}
其中$ctx.source.id链接到用户->id