合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 记录头 ## 控制台记录头 **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" ], // ... ] ~~~ 尽管它不像对象文字语法那么优雅,但是对于调试目的,它无疑是可读且有用的。