【发布时间】:2023-03-15 23:08:01
【问题描述】:
我正在制作一个 React 项目,并且我使用 Express 作为后端。我将http://mini-api.moonlab.ga 设置为 Express 服务器的虚拟主机。
我使用 Fetch 向表达服务器发送了一个 HTTP 请求:
fetch("http://mini-api.moonlab.ga/login/", {
credentials: "include"
})
正如我所料,出现了 CORS 错误。所以我安装了cors包,我在Node.js中设置了这样的代码:
app.use(cors({
origin: true,
credential: true
}));
我这样从服务器响应客户端:
app.get("/login", (req, res) => {
const session = req.session;
if (session.miniAccount == undefined) {
session.miniAccount = Math.floor(Math.random() * 1000000);
}
res.writeHead(200, {"Access-Control-Allow-Credentials": true});
res.write(String(session.miniAccount));
res.end();
})
在我这样做之后,没有任何 CORS 错误,但会话不会持续存在。当我再次发送请求时,会话数据会不断变化。
那么如何让会话持续存在?
服务器的会话代码:
app.use(express_session({
secret: secret.app_key,
resave: false,
saveUninitialized: true
}));
【问题讨论】:
-
你用什么来存储会话?
-
我正在使用
express-session。 -
这并不能回答我的问题,因为有几十个用于快速会话的存储提供商。请出示您的快速会话代码 sp,我们可以看到您正在使用的存储提供程序以及您的会话初始化代码和会话中间件。
-
从代码中看不出为什么会这样。您需要从 Chrome 调试器的网络选项卡中对其进行调试。在那里,您可以看到您的每个
fetch()调用,并查看您从第一个 fetch 调用返回的 cookie 是否与第二个 fetch 调用一起发送。如果是这样,那么问题可能出在您的服务器代码中,因为它无法识别返回的会话 cookie。如果不是,那么问题可能出在您的客户端代码/配置中,并且 cookie 没有被保留。只有您可以在实际安装时进行此调试。 -
确实是这个问题。因为您正在向跨域发出请求,所以 cookie 将是第三方 cookie。有各种与第三方 cookie 相关的额外控制措施,并且您的 cookie 可能由于这些设置而被浏览器阻止存储。您可以先阅读 here 关于第三方 cookie 的信息。请注意,浏览器设置可以限制第三方 cookie,而 cookie 本身的服务器设置可以限制第三方 cookie。
标签: node.js reactjs express session