Express 中的 req.header 与 req.headers

Mr.*_*ien 11 node.js express body-parser

我正在将 Express 与 Body Parser 一起使用。给定以下标题键:

X-Master-Key

当我使用下面的代码片段时,它无法输出值

req.headers['X-Master-Key'] // Fails
Run Code Online (Sandbox Code Playgroud)

但是当以上更改为时,它起作用了

req.headers['x-master-key'] // Works
Run Code Online (Sandbox Code Playgroud)

此外,当我尝试输出时req.headers,结果发现 Express 以小写格式输出所有标题。


我开始进一步挖掘并尝试使用以下代码,这些片段中的任何一个都有效

req.header('X-Master-Key'); // Works

// -- OR

req.header('x-master-key'); // Works
Run Code Online (Sandbox Code Playgroud)

那么这里有什么问题呢?为什么 Express 将所有标题键更改为小写?此外,如何使用req.header()req.headers[]?

Kry*_*ten 21

出现问题是因为在 HTTP 协议中,标头不区分大小写。这意味着content-type, Content-Type, 和coNTEnt-tYPe都指向同一个头文件,并且 Express 框架需要能够处理它们中的任何一个。

req.headers(对象)和req.header(函数)之间的区别就是:

如果要从 Javascript 对象获取属性,则属性名称区分大小写。所以req.headers['content-type']会起作用;req.headers['Content-Type']将不会。为什么小写版本有效?因为 Express 框架试图处理所有不同的可能情况(请记住,HTTP 允许任何情况),将所有情况都转换为小写。

但是 Express 的开发人员认识到您(开发人员)可能正在寻找Content-Type并且您可能不记得转换为小写,因此他们提供了一个函数,req.header,它将为您解决这个问题。

所以,简而言之:

建议这样做:

const myHeader = req.header('Content-Type');
Run Code Online (Sandbox Code Playgroud)

使用您想要的任何大小写 - 该函数会将其转换为小写并在req.headers.

不推荐这样做:

const myHeader = req.headers['Content-Type'];
Run Code Online (Sandbox Code Playgroud)

如果您不使用小写的标题名称,您将不会得到您期望的结果。