You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.rawHeadersobjectobject
Object.keys(req.rawHeaders)['0', '1', '2', '3', ...][]
Object.getOwnPropertyNames(req.rawHeaders)['0', '1', '2', '3', ...][]
Array.isArray(req.rawHeaders)truefalse
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:22:05