Fastify 中遇到的一个奇怪的 Bug 及解决方案

阅读时长 3 分钟读完

最近在使用 Fastify 开发项目时,遇到了一个奇怪的 Bug,导致请求头中的一些自定义字段没有被识别。经过调试,最终找到了解决方案,现在将其分享给大家。

Bug 表现

我们在请求头中加入了一个自定义字段 X-Token,但是在 Fastify 的请求对象 request 中却无法正确获取到这个字段的值。

具体表现如下:

可以看到,在 request.headers 中,确实包含了我们添加的 X-Token 字段,但是通过 request.headers['x-token'] 获取到的却是 undefined

原因分析

我们对请求头字段名的大小写进行了调整,将 X-Token 改为了 x-token,但是在 Fastify 中,请求头中的字段名均被转为小写格式存储。

所以,当我们通过 request.headers['x-token'] 访问时,实际上访问的是 request.headers['x-token'],本质上两个属性是不同的。

解决方案

解决这个问题,我们需要将请求头中的字段名转为小写格式。此处有两种方法:

方法一:使用 Fastify 提供的内置函数

Fastify 提供了内置函数 fastify.lowerCaseHeaders(),可将请求头中的所有字段名转为小写格式。我们只需要在启动 Fastify 时添加如下代码即可:

-- -------------------- ---- -------
----- ------- - --------------------

-----------------------------------------

--------------------------- ----- ----- -- -
  ----------------------------- --------- ------ ----- -- -
    ---------------------------------
    ------
  --
--

--------------------

通过在 onRequest 钩子函数中调用 fastify.lowerCaseHeaders(request),即可实现请求头字段名小写化。

方法二:手动编写钩子函数

我们也可以编写自己的钩子函数实现请求头字段名小写化。只需要在 onRequest 钩子函数中将请求头字段名转为小写格式即可:

-- -------------------- ---- -------
---------------------------- --------- ------ ----- -- -
  ---------------------------------------- -- -
    ----- ------------ - -----------------
    -- ------------- --- ---- -
      ----------------------------- - --------------------
      ------ --------------------
    -
  --

  ------
--

总结

在使用 Fastify 进行开发时,如果遇到请求头自定义字段无法获取的问题,需要仔细检查请求头字段名的大小写格式,一定要记住,在 Fastify 中,请求头字段名被统一转为小写格式存储。

对于解决这个问题,我们可以使用 Fastify 提供的内置函数 fastify.lowerCaseHeaders(),也可以手动编写钩子函数。无论哪种方法,都需将其添加到 onRequest 钩子函数中,以确保请求头小写化在处理请求之前完成。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c106cf83d39b488156113e

纠错
反馈