请求头中的Req.headers.cookie为空,即使请求头中有cookie。

8
使用Express,我有以下设置:
const express = requires("express");
const path = requires("path");
const bodyParser = requires("body-parser");
const cookieParser = requires("cookie-parser");

let server = express();
server.set("port", (process.env.PORT || 5000));
server.set("views",  path.join(__dirname, "/views"));
server.set("view engine", "ejs");
server.use(cookieParser());
server.use(express.static(self.workingDirectory + "/public"));
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: true }));
server.use((req, res, next) => {
    // if req.cookies exists and testcookie is undefined within req.cookies
    if ( req.cookies && typeof req.cookies["testcookie"] === "undefined" ) {
        console.log("Setting cookie! Testcookie was not found");
        res.cookie("testcookie", "test", {
            maxAge : ((((1000*60)*60)*24)*7), /* expire a week from today */
            httpOnly: true /* document.cookie doesn't return this cookie */
        });
    }
    next();
});
server.get("/", (req, res) => { res.render("pages/index"); });
server.listen(server.get("port"), () => { console.log("Server started!"); });

所以当我访问/时,cookie会被设置为适当的值,但在之后的每次访问中,它仍然会被设置。稍后当我通过新的中间件运行console.log(req.headers)时,在访问/时每次都会显示以下内容,尽管cookie应该已经被设置:

响应头中包含了cookie:

我在这里做错了什么吗?我弄不清楚问题出在哪里... cookie-parser 不是应该用来将 req.headers.cookie 中的 cookie 填充到 req.cookies 中吗?为什么 req.headers.cookie 返回为空?如果我注释掉与 cookie-parser 有关的任何内容,req.headers.cookie 也会返回空。


你能否粘贴你剩余的代码,包括你正在使用的中间件以console.log(req.headers)输出请求头信息? - Rahul Arora
1
我建议检查您的浏览器设置,我认为 cookies 已被禁用。当我在我的端运行您的代码时,它运行正常。 - rootExplorr
2个回答

3

你的代码看起来没有任何问题。以下是编辑过(删除了视图引擎细节)的代码示例,供参考。它使用以下 npm 包版本:

"dependencies": {
    "body-parser": "^1.17.2",
    "cookie-parser": "^1.4.3",
    "express": "^4.15.3"
  } 

添加了一个额外的中间件 (exampleMiddleWare) 来突出显示路由上的 cookie 检查。

const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");

let server = express();

server.set("port", (process.env.PORT || 5000));

server.use(cookieParser());

server.use(bodyParser.json());
server.use(bodyParser.urlencoded({extended: true}));

server.use((req, res, next) => {
    // if req.cookies exists and testcookie is undefined within req.cookies
    if (req.cookies && typeof req.cookies["testcookie"] === "undefined") {
        console.log("Setting cookie! Testcookie was not found");
        res.cookie("testcookie", "test", {
            maxAge: ((((1000 * 60) * 60) * 24) * 7), /* expire a week from today */
            httpOnly: true /* document.cookie doesn't return this cookie */
        });
    }
    next();
});

const exampleMiddleWare = (req, res, next) => {
    res.hasTestCookie = !!req.cookies.testcookie
    next();
};

server.get("/", exampleMiddleWare, (req, res) => {
    res.send(`<h1>Cookie Test</h1><h2>Cookie Found: ${res.hasTestCookie}</h2>`);
});

server.listen(server.get("port"), () => {
    console.log("Server started!");
});

如果您无法使上述内容正常工作,那么可以在不同的浏览器中进行健全性检查,因为浏览器选项和插件可以覆盖或更改您的cookie设置。

0

我尝试了上面的代码片段,req.headers.cookie不为空。我从req.header中收到了cookie值。

    const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");

let server = express();
// server.set("port", (process.env.PORT || 5000));
// server.set("views",  path.join(__dirname, "/views"));
// server.set("view engine", "ejs");
server.use(cookieParser());
// server.use(express.static(self.workingDirectory + "/public"));
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: true }));
server.use((req, res, next) => {
    // if req.cookies exists and testcookie is undefined within req.cookies
    if ( req.cookies && typeof req.cookies["testcookie" ] === "undefined" ) {
        console.log("Setting cookie! Testcookie was not found");
        res.cookie("testcookie", "test", {
            maxAge : ((((1000*60)*60)*24)*7), /* expire a week from today */
            httpOnly: true /* document.cookie doesn't return this cookie */
        });
    }
    next();
});
server.get("/", (req, res) => { console.log(req.headers);
  res.send(`<h1> hello world </h1>`); });
server.listen(5000, () => { console.log("Server started!"); });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接