我遇到了 cookie 问题,它们被创建,被发送到浏览器,浏览器将 cookie 发回,但 req.cookies 在服务器中未定义...
我做错了什么?
谢谢您的帮助。
我尝试过在 localhost 和 127.0.0.1 中使用所有环境,结果完全相同,cookie 被写入浏览器中并发送回,但是 req.cookies 在这两种情况下都未定义。
header request
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding:
gzip, deflate, br
Accept-Language:
es-ES,es;q=0.9
Cache-Control:
max-age=0
Connection:
keep-alive
Cookie:
sessionId=example
Host:
127.0.0.1:3000
If-None-Match:
W/"7-PEnZzDwMg0IaHPuSHN1Ko13Bulw"
Sec-Ch-Ua:
"Not A(Brand";v="99", "Opera GX";v="107", "Chromium";v="121"
Sec-Ch-Ua-Mobile:
?0
Sec-Ch-Ua-Platform:
"Windows"
Sec-Fetch-Dest:
document
Sec-Fetch-Mode:
navigate
Sec-Fetch-Site:
none
Sec-Fetch-User:
?1
Upgrade-Insecure-Requests:
1
User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 OPR/107.0.0.0
/index.ts
import cookieParser from 'cookie-parser';
[...]
app.use(cookieParser('' + process.env.COOKIE_SECRET));
[...]
app.use('/', indexRouter)
/routes/index.ts
import express from 'express';
const router = express.Router();
/* GET home page. */
router.get('/', function (req, res, next) {
console.log(req.cookies); // always undefined
res.cookie("sessionId", "example");
res.send("running");
});
export default router;
最后我所做的是直接从标头手动读取 cookie。因为我怀疑问题是由 localhost 引起的,所以我创建了一个中间件,它将使用 cookie 解析器作为第一个选项,如果它不起作用,我会手动读取并解析标头中的 cookie。这是代码:
export function cookieReader(req: any): { [key: string]: string } | undefined {
if (req.cookies !== undefined) {
return req.cookies;
}
if (req.headers.cookie !== undefined) {
let cookie: any = {};
req.headers.cookie.split(/\W*\;\W*/g).forEach((x: any) => {
const kv = x.split(/\W*\=\W*/g);
cookie[kv[0]] = decodeURIComponent(kv[1]);
});
return cookie;
}
return undefined;
}