我正在学习node.js/express,我试图从头部获取Date值并将其发送到前端。
我似乎不能使用req.getHeader()
来做这件事。我也尝试console.log(req)
和console.log(req.headers)
,但输出与postman中的头不同。
这就是console.log(req.headers)
给我的:
{
'user-agent': 'PostmanRuntime/7.28.0',
accept: '*/*',
'cache-control': 'no-cache',
'postman-token': '6d5acbf2-b63d-46d4-b189-86e163281421',
host: 'localhost:3001',
'accept-encoding': 'gzip, deflate, br',
connection: 'keep-alive'
}
这与 Postman 的标题不同:
下面是我的代码:
const express = require("express");
const app = express();
const cors = require("cors");
const PORT = process.env.PORT || 3001;
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
let persons = [
{
id: 1,
name: "Arto Hellas",
number: "040-123456",
},
{
id: 2,
name: "Ada Lovelace",
number: "39-44-5323523",
},
{
id: 3,
name: "Dan Abramov",
number: "12-43-234345",
},
{
id: 4,
name: "Mary Poppendieck",
number: "39-23-6423122",
},
];
app.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
app.get("/api/persons", (req, res) => {
res.json(persons);
});
app.get("/api/persons/:id", (req, res) => {
const id = Number(req.params.id);
const person = persons.find((person) => person.id === id);
const unknown = persons.id == "unknown";
if (person) {
res.json(person);
} else {
res.status(404).end();
}
});
app.get("/info", (req, res) => {
let count = persons.length;
let str = `Phonebook has info for ${count} people.`;
console.log(req);
console.log(req.headers);
let timeDate = req.getHeader(Date); // <-- here is the problem
console.log(timeDate);
res.send(`<p>${str} \n ${timeDate}</p>`);
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
3条答案
按热度按时间r7xajy2e1#
首先,如果您使用Express,那么最好用途:
因为这规范了许多事情(如大小写敏感性和可互换的标题名称)。
然后,你必须传递一个String,如下所示:
请注意,从浏览器传入的http请求不包含
Date
标头。因此,只有当您有某种自定义客户端添加该头时,才会有这样的头。您的
req.getHeader()
不工作,因为对于传入的http消息对象,不存在这样的方法。这在nodejs文档中有点令人困惑,但您正在查看http.ClientRequest
对象。这不是传入http请求的req
参数。您将得到一个http.IncomingMessage
对象,该对象在此处记录,但没有req.getHeader()
。它有req.headers
,它为您提供了整个头对象,然后您可以访问您想要的对象。或者,只需使用Express提供的
req.get("Date")
,它可以让您进行不区分大小写的访问。请记住,从浏览器传入的http请求没有Date
头,因此您的服务器要使用该头,它必须来自将该头添加到其请求的客户端。从服务器返回到浏览器的响应将具有Date
标头。您可能正在查看的文档中确实有
req.getHeader()
方法的对象是http.ClientRequest对象,它是您从http.get()
返回的对象,它引用来自客户端的传出http请求,而不是服务器上的传入http请求。是的,这有点令人困惑,因为所有的例子都倾向于使用相同的
req
变量名,但不同的用法会为该变量产生不同的对象。31moq8wy2#
您使用的是哪个版本的节点?尝试升级到LTS版本。都应该工作
dfddblmv3#
使用camelCase,将
postman-token
更改为postmanToken
。因为自定义头将在express中自动删除。