【发布时间】:2021-03-21 16:02:54
【问题描述】:
我有一个 Appsync 架构,它定义了一个用户类型,它本身包含一个注释列表:
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 解析器,它本身迭代地调用类似的 API GET /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 令牌,我如何确保它始终传递给任何被调用的解析器?
【问题讨论】:
-
听起来像一个愚蠢的问题,但只是为了排除这种可能性,您是否在您的子解析器中尝试过
ctx.request.headers.Authorizationt?因为results字段只对响应映射模板可用。 -
我确实尝试过,但不幸的是,
ctx.request在调用子解析器之前被清空。作为测试,我将整个$ctx注入到 lambda 函数中,这样我就可以将其注销,并且其中没有包含标题的任何内容。这让我觉得我需要对父解析器做一些事情来缓存标题?但我不知道这是否可能 -
我相信这可以通过 Pipeline resolver 轻松解决。
标签: graphql http-headers aws-api-gateway aws-appsync