# 记录头
## 控制台记录头
**TL; DR:**如果只需要将Headers对象记录到控制台,则使用Map:
~~~javascript
console.log(new Map(request.headers))
~~~
如果您需要快速字符串化Headers对象,请使用传播运算符:
~~~javascript
let requestHeaders = JSON.stringify([...request.headers])
~~~
### 问题
在调试Worker脚本时,我们通常希望检查请求或响应上的标头。一个常见的陷阱是尝试通过以下代码将标头记录到开发人员控制台:
~~~javascript
console.log(request.headers)
~~~
或这个:
~~~javascript
console.log(`Request headers: ${JSON.stringify(request.headers)}`)
~~~
`{}`即使调用`request.headers.has('Your-Header-Name')`可能返回true,这两者都导致看似为空对象的字符串(\-)。这与浏览器实现的行为相同。
发生这种情况的原因是因为[Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers)对象不在可枚举的JavaScript属性中存储标头,因此开发人员控制台和JSON字符串识别器不知道如何读取标头的名称和值。它*本身*不是一个空对象,而是一个不透明的对象。
标头对象是可迭代的,但是,我们可以利用它开发一些快速的单行代码来调试打印标头。
## 通过地图传递标题对象
使Headers变得`console.log()`友好的第一个常用习惯是从Headers对象构造Map对象,并记录Map对象。
~~~javascript
console.log(new Map(request.headers))
~~~
之所以有效,是因为:
* 可以从诸如Headers之类的可迭代对象构造Map对象。
* Map对象*确实*将其条目存储在可枚举的JavaScript属性中,因此开发人员控制台可以对其进行查看。
### 将标题传播到数组中
Map技巧适用于对的简单调用`console.log()`,但是如果我们需要实际对标头进行字符串化处理,我们很快就会发现,对Map进行字符串化仅产生了`[object Map]`,这不是很有帮助。
JSON字符串化器也无济于事:即使我们的Map将其数据存储在可枚举的属性中,该属性也是[Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol)键控的,而`JSON.stringify()`[忽略了Symbol键控的属性](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description)\-我们`{}`再次以空值结束。
相反,我们可以通过将[扩展运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)(`...`)应用于标头对象,以新的方式利用标头对象的可迭代性。
~~~javascript
let requestHeaders = JSON.stringify([...request.headers], null, 2)
console.log(`Request headers: ${requestHeaders}`)
~~~
结果是:
~~~javascript
Request headers: [
[
"accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
],
[
"accept-encoding",
"gzip"
],
[
"accept-language",
"en-US,en;q=0.9"
],
[
"cf-ipcountry",
"US"
],
// ...
]
~~~
尽管它不像对象文字语法那么优雅,但是对于调试目的,它无疑是可读且有用的。
- 关于本翻译文档
- 快速开始
- 模版库
- 讲解
- Workers页面
- 从0开始
- 从已有页面开始
- 从已有Worder开始
- 工具
- Cli工具 wrangler
- 安装
- 指令
- 配置
- 环境
- Webpack
- 密钥
- KV
- 网站
- Playground
- ServerLess插件
- Terraform
- REST API
- Making Requests
- Scripts
- Bindings
- Routes
- Integrations
- 相关
- 工作原理
- 安全
- 使用缓存
- 价格
- Routes
- Limits
- 提示
- 调试技巧
- 调试header
- FetchEvent生命周期
- 请求上下文
- 请求sign
- 参考
- runtime API
- Web Standards
- fetch
- fetchEvent
- Response
- Request
- KV
- Environment Variables
- Streams
- Encoding
- Web Crypto
- Cache API
- HTMLRewriter
- Workers KV
- Use cases
- Namespaces