如何在RESTDataSource请求中包含标头?

时间:2019-04-29 01:47:56

标签: javascript apollo-server

我正在尝试使用apollo RESTDataSource包装我的其余api。我需要将一些标头传递给api调用。

我正在遵循文档中的示例:https://www.apollographql.com/docs/apollo-server/features/data-sources#intercepting-fetches

这是我的代码:

  willSendRequest(request: RequestOptions) {
    console.log(`request 1: ${JSON.stringify(request)}`);
    request.headers.set('Authorization', this.context.authorization);
    console.log(`request 2: ${JSON.stringify(request)}`);
  }

我希望标题包含“授权”。但是它总是空的。

上述代码中的日志:

request 1: {"method":"POST","path":"partnerinvoices","body":{"command": "input","params":{},"headers":{}}
request 2: {"method":"POST","path":"partnerinvoices","body":{"command":"input","params":{},"headers":{}}

我可以使用willSendRequest方法覆盖正文和参数,而不会出现任何问题。

3 个答案:

答案 0 :(得分:1)

您可以通过几种方法来实现此目标,

在扩展RESTDataSource的Datasources类中,在发出请求之前设置标头

willSendRequest(request) {
 request.headers.set('Authorization', 'Bearer .....')
}

或作为数据源方法中的第三个参数(发布,获取,放置...)

this.post('endpoint', {}, { headers: { 'Authorization': 'Bearer ...' } })

答案 1 :(得分:0)

如果要使用Typescript,则必须与willSendRequest方法的原始签名相匹配:

protected willSendRequest?(request: RequestOptions): ValueOrPromise<void>;

(链接到docs

因此,请确保该方法如下所示:

    protected willSendRequest?(request: RequestOptions): ValueOrPromise<void> {
        request.headers.set("Authorization", this.context.authorization);
    }

答案 2 :(得分:0)

您需要使用request.headers.get('Authorization')来获取所需的数据。使用JSON.stringify不会为您提供标头值,因为它不是对象文字。

willSendRequest(request: RequestOptions) {
    console.log(`request 1: ${request.headers.get('Authorization')}`);
    request.headers.set('Authorization', this.context.authorization);
    console.log(`request 2: ${request.headers.get('Authorization')}`);
  }