即使请求标头中包含cookie,Req.headers.cookie也为空

Blu*_*gon 5 javascript node.js express

使用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!"); });
Run Code Online (Sandbox Code Playgroud)

因此,当我访问/cookie 时,cookie会设置为适当的值,但此后的每次访问都会不断设置。稍后,当我运行console.log(req.headers) 新的中间件时/,即使应该设置cookie,它也会在每次访问时显示以下内容:

响应头中包含cookie:

我在这里做错什么了吗?我不知道怎么了...不是要用该属性中的Cookie cookie-parser填充吗?为什么返回为空。如果我注释掉任何相关的内容,也会返回空。req.cookiesreq.headers.cookiereq.headers.cookiereq.headers.cookiecookie-parser

rou*_*der 3

您的代码似乎没有任何问题。您的下面的代码(经过编辑以删除查看引擎详细信息)有效。作为参考,它使用以下 npm 包版本:

"dependencies": {
    "body-parser": "^1.17.2",
    "cookie-parser": "^1.4.3",
    "express": "^4.15.3"
  } 
Run Code Online (Sandbox Code Playgroud)

添加了一个额外的中间件 ( 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!");
});
Run Code Online (Sandbox Code Playgroud)

如果您无法完成上述工作,则可能会在不同的浏览器中进行健全性检查,因为您的 cookie 设置可能会被浏览器选项和插件覆盖或更改。