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

xj3cbfub  于 2023-02-03  发布在  Node.js
关注(0)|答案(3)|浏览(167)

我正在尝试添加一个自定义头到我的请求中,但是必须在接口中修改/实现它。
默认的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,我可以确认正在使用的Request接口来自Express,Fastify向后兼容所有Express模块,主要使用Fastify是因为它更快。
kse8i1jr

kse8i1jr1#

声明中的模块名称似乎错误。
即使IncomingHttpHeaders接口从express-serve-static-core附加到Request对象,IncomingHttpHeaders接口的原始源实际上也是http包的一部分。
下面的代码允许在代码中访问自定义头文件,并且正确编译了ts。

import { IncomingHttpHeaders } from 'http';

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

i1icjdpr2#

不管出于什么原因,它都认为你传入的字符串是一个数组,但是除此之外,如果你需要设置一个自定义的头(它不是一个动态值),你可以使用@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),
      );
  }
}
u3r8eeie

u3r8eeie3#

我最近遇到过这样的问题,对我有效的解决方案是创建一个从 IncomingHttpHeaders 扩展的类型

import { IncomingHttpHeaders } from "http2";

interface MyCustomsHearders {
    foo: "bar";
}

type IncomingCustomHeaders = IncomingHttpHeaders & MyCustomsHearders;
const { foo } = req.headers as IncomingCustomHeaders;

我知道这不是解决问题的最“正式”的方法,但对我来说效果很好。

相关问题