TypeScript 在 Express 中添加自定义请求标头

Posted

技术标签:

【中文标题】TypeScript 在 Express 中添加自定义请求标头【英文标题】:TypeScript add custom Request header in Express 【发布时间】:2020-03-16 20:46:09 【问题描述】:

我正在尝试向我的请求添加 自定义标头,但必须在界面中对其进行修改/实现。

默认的Request 接口引用IncomingHttpHeaders。所以我试图用我自己的自定义令牌头来扩展这个接口。

import  IncomingHttpHeaders  from 'http';

declare module 'express-serve-static-core' 
    interface IncomingHttpHeaders 
        "XYZ-Token"?: string
    

我已更新我的.tsconfig 文件以读取./types 文件夹。我的文件名是index.d.ts

如果我不使用自定义标头,我可以成功编译代码,但是当我尝试在代码中引用令牌标头时,我收到以下编译错误:

错误

error TS2538: Type 'string[]' cannot be used as an index type.

    req.headers['XYZ-Token']

如果我使用原始界面的任何值,一切正常。

示例:

    req.headers['user-agent']

其他信息:我正在使用 NestJS,它在后台使用 Fastify/Express。我可以确认正在使用的请求接口来自 Express。 Fastify 向后兼容所有 Express 模块。主要使用 Fastify,因为它更快。

【问题讨论】:

【参考方案1】:

声明中的模块名称似乎有误。

尽管IncomingHttpHeaders 接口从express-serve-static-core 附加到Request 对象,IncomingHttpHeaders 接口的原始来源实际上是http 包的一部分。

以下允许自定义标头可在代码中访问,ts 正确编译。

import  IncomingHttpHeaders  from 'http';

declare module 'http' 
    interface IncomingHttpHeaders 
        "XYZ-Token"?: string
    

【讨论】:

【参考方案2】:

无论出于何种原因,它认为您传入的字符串是一个数组,但除此之外,如果您需要设置自定义标头(并且它不是动态值),您可以使用@Header() 装饰器。如果它是动态的,那么您可以使用拦截器在飞行前获取响应并在其中设置标头,例如

@Injectable()
export class CustomHeaderInterceptor implements NestInterceptor 
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> 
    return next
      .handle()
      .pipe(
        tap(() => context.switchToHttp().getResponse().header('XYZ-Token', customValue),
      );
  

【讨论】:

感谢@Headers 提供的信息。通过扩展 IncomingHttpHeaders 接口,我能够让我的代码使用新的标头。我需要在整个 API 中进行全局更改。看起来当我声明新类型时,我仍在指定 express-serve-static-sore,它需要是 http 模块。

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

如何将 Typescript 定义添加到 Express req 和 res

Typescript Express 项目中的客户端 Javascript

使用 TypeScript 扩展 Express Request 对象

TypeScript:用自己的类扩展 Express.Session 接口

Typescript 2.2 Express req, res 隐含任何

如何在 Typescript 项目中使用 express-mysql-session?