Express.js中无法获取浏览器存储的Cookie问题求助
我已经在浏览器成功设置了存储JWT Token的Cookie,但使用req.cookies获取时返回undefined和[object: null prototype] {}。我已经尝试引入cookie-parser并配置了CORS,Cookie的键名设置为token,但问题仍未解决。
认证中间件代码
exports.isAuthenticated = asyncErrorHandler(async (req, res, next) => { // 从cookie中获取jwt token const { token } = req.cookies; console.log(req.cookies); if (!token) return next(new ErrorHandler("plz log in first ", 400)); // 验证token是否匹配存储的jwt const decodedData = jwt.verify(token, process.env.JWT_SECRET); req.user = await userModel.findById(decodedData.id); next(); });
Express项目app.js代码
const express = require("express"); const errorMiddleware = require("./middleware/error"); const cookieParser = require("cookie-parser"); const bodyparser = require("body-parser"); const fileupload = require("express-fileupload"); const cors = require("cors"); const app = express(); app.use(cookieParser()); app.use(express.json()); app.use(bodyparser.urlencoded({ extended: true })); app.use(fileupload()); app.use( cors({ credentials: true, origin: "http://127.0.0.1:5173", optionsSuccessStatus: 200, }) ); // 路由导入 const productRoutes = require("./routes/productRoutes"); const userRoutes = require("./routes/userRoutes"); const orderRoutes = require("./routes/orderRoute"); const bodyParser = require("body-parser"); app.use("/api/v1", productRoutes); app.use("/api/v1/user", userRoutes); app.use("/api/v1", orderRoutes); // 错误处理中间件 app.use(errorMiddleware); module.exports = app;
终端报错情况
终端输出req.cookies为[object: null prototype] {},并触发了plz log in first的错误提示。
排查方向及解决方法
检查Cookie的SameSite属性
前后端跨域时,设置Cookie需确保SameSite为None,同时搭配Secure属性(本地http开发时可暂时改为Lax,上线后再切换回None + Secure),否则浏览器可能会拦截Cookie。确认前端请求携带Credentials
前端发送请求时必须开启withCredentials: true(比如Axios中设置axios.defaults.withCredentials = true),否则Cookie不会被携带到后端接口。核对Cookie的域名与路径
本地开发时如果前后端域名/端口不一致,要确保Cookie的domain设置匹配(比如统一用127.0.0.1而非混合localhost),path设为/以覆盖所有接口路径。验证cookie-parser的加载顺序
确保app.use(cookieParser())放在所有路由、解析类中间件之前,否则请求被处理后cookie-parser无法再解析Cookie。检查浏览器Cookie存储状态
在浏览器开发者工具的Application > Cookies中,确认Cookie的Name是token,Domain和Path与请求接口匹配;若开启了HttpOnly,前端无法通过document.cookie读取,但后端req.cookies仍能获取(前提是其他条件满足)。
内容的提问来源于stack exchange,提问作者Usama AHMED

