最近在使用 Fastify 开发项目时,遇到了一个奇怪的 Bug,导致请求头中的一些自定义字段没有被识别。经过调试,最终找到了解决方案,现在将其分享给大家。
Bug 表现
我们在请求头中加入了一个自定义字段 X-Token
,但是在 Fastify 的请求对象 request
中却无法正确获取到这个字段的值。
具体表现如下:
fastify.get('/', (request, reply) => { console.log(request.headers) // 输出请求头 console.log(request.headers['x-token']) // 输出 undefined // ... })
可以看到,在 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