在 NestJS 中添加标头 HttpRequest

Posted

技术标签:

【中文标题】在 NestJS 中添加标头 HttpRequest【英文标题】:Add headers HttpRequest in NestJS 【发布时间】:2019-03-29 01:59:09 【问题描述】:

我正在尝试在 NestJS 中发出 Http 请求

因为它的灵感来自 Angular,所以我添加了我的标题

import  Injectable, HttpService from '@nestjs/common';
...
const headersRequest = new Headers();
headersRequest.append('Content-Type', 'application/json');
headersRequest.append('Authorization', `Basic $encodeToken`);

然后调用api

const result = await this.httpService.post(apiUrl, newDevice,  headers: headersRequest );

我收到一个错误

ReferenceError: Headers is not defined

当我使用 Headers 进行导入时 我在 VScode 中收到此消息警告

Only a void function can be called with the 'new' keyword.

【问题讨论】:

【参考方案1】:

NestJS 在后台使用axios 发出http 请求,请查看其请求配置文档:

https://github.com/axios/axios#request-config

貌似没有headers的接口,只传一个普通的JS字典对象:

const headersRequest = 
    'Content-Type': 'application/json', // afaik this one is not needed
    'Authorization': `Basic $encodeToken`,
;

const result = await this.httpService.post(apiUrl, newDevice,  headers: headersRequest );

【讨论】:

【参考方案2】:

我认为这种方法是错误的 在 for read headers 参数中只是 req.headers 例子

 @Get()
    findHeaderexample(@Res() res,@Req req) 
        return req.headers;

【讨论】:

谢谢 Riadh 但这不完全是我要做的,我会设置标题以在控制器内(完全在服务内)创建一个 httpRequest,而不是获取 req 标题 可以解释一下你的想法【参考方案3】:

如果您的encodeToken 是静态的或从您的配置硬编码的另一个选项(因为nest v5 引入了HttpModule.registerAsync)是在模块级别设置它:

import  Module, HttpModule  from '@nestjs/common';
import  ConfigModule  from '..';
import  ConfigService  from '../config/config.service';


@Module(
  imports: [
    ConfigModule,
    HttpModule.registerAsync(
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => (
        baseURL: configService.get('vendors.apiEndpoint'),
        headers:           
          'Authorization': 'Basic ' + configService.get('vendors.encodeToken')
        ,
        timeout: 7000,
        maxRedirects: 5
      ),
      inject: [ConfigService]
    )
  ],
  // ... other module stuff
)

export class MyModule 

【讨论】:

以上是关于在 NestJS 中添加标头 HttpRequest的主要内容,如果未能解决你的问题,请参考以下文章

NestJs Socket io 适配器:如果使用 false 调用 allowFunction,服务器不会将 CORS 标头添加到握手的响应中。错误或配置错误?

所有控制器的全局标头(nestJs swagger)

@nestjs/swagger 没有设置授权标头

我可以在我的 graphql 查询中访问请求标头,在 nestjs 中吗?

更新nestjs/graphql后没有通过标头

NestJS 将 Authorization 标头传递给 HttpService