express/node.js - req.getHeader不是函数

gblwokeq  于 2023-06-05  发布在  Node.js
关注(0)|答案(3)|浏览(229)

我正在学习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}`);
});
r7xajy2e

r7xajy2e1#

首先,如果您使用Express,那么最好用途:

req.get("someHeader")

因为这规范了许多事情(如大小写敏感性和可互换的标题名称)。
然后,你必须传递一个String,如下所示:

req.get("Date");

请注意,从浏览器传入的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变量名,但不同的用法会为该变量产生不同的对象。

31moq8wy

31moq8wy2#

您使用的是哪个版本的节点?尝试升级到LTS版本。都应该工作

dfddblmv

dfddblmv3#

使用camelCase,将postman-token更改为postmanToken。因为自定义头将在express中自动删除。

相关问题