Deno中node:http的Request.rawHeaders不符合预期是何原因?
Deno中node:http模块的req.rawHeaders行为不符合预期
我在Deno应用中使用node:http包创建服务器时,发现该包在Deno与Node中的行为存在差异,且不符合Deno官方文档定义,核心问题是req.rawHeaders的值完全不符合预期。
我通过以下代码检查req.rawHeaders的具体表现:
import * as http from "node:http" http.createServer((req, res) => { console.log(req.rawHeaders) console.log(req.rawHeaders.toString()) console.log(JSON.stringify(req.rawHeaders)) console.log(typeof req.rawHeaders) console.log(Object.keys(req.rawHeaders)) console.log(Object.getOwnPropertyNames(req.rawHeaders)) console.log(Array.isArray(req.rawHeaders)) console.log(Object.getPrototypeOf(req.rawHeaders)) console.log("-------------") res.end() }).listen(80)
我在Node环境中用类似代码做了对比测试,向两个服务器发起请求后得到如下结果:
传入console.log的值 | Node中的控制台结果 | Deno中的控制台结果 |
|---|---|---|
req.rawHeaders | ['Host', 'localhost', 'Connection', 'keep-alive', ...] | Headers { accept: "text/html,application... 查看表格下方的格式化值 |
req.rawHeaders.toString() | Host,localhost,Connection,keep-alive, ... | [object Headers] |
JSON.stringify(req.rawHeaders) | ["Host","localhost","Connection","keep-alive", ...] | {} |
typeof req.rawHeaders | object | object |
Object.keys(req.rawHeaders) | ['0', '1', '2', '3', ...] | [] |
Object.getOwnPropertyNames(req.rawHeaders) | ['0', '1', '2', '3', ...] | [] |
Array.isArray(req.rawHeaders) | true | false |
Object.getPrototypeOf(req.rawHeaders) | Object(0) [] | Headers {} |
上述表格第1行第3列的格式化值:
Headers { accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "accept-encoding": "gzip, deflate, br, zstd", "accept-language": "en-US,en;q=0.9", connection: "keep-alive", host: "localhost", ... }
根据Deno官方文档中rawHeaders的定义,该属性应该是一个字符串数组,但在Deno中实际返回的是一个Headers对象。更奇怪的是,虽然console.log能显示这个对象的属性,但直接通过rawHeaders['host']或rawHeaders.host访问时却返回undefined,完全无法读取这些属性——console.log到底是怎么访问到这些值的?
这是我的操作有误,还是Deno的bug?
最小可复现仓库
提供了专门的仓库用于复现该问题
额外细节
我是在Deno中使用vhost包时发现这个问题的——该包无法根据子域名重定向到正确的处理程序,推测原因就是无法读取host头。我选择使用express而非oak,是因为oak需要过多样板代码,且不确定能否与vhost配合使用。
- Deno版本:v2.0.4
- Node版本:v20.17.0
- 操作系统:Windows 10 Pro build 19045.5011(64位)
内容的提问来源于stack exchange,提问作者Tom4nt
相关产品推荐
相关产品推荐

