node.js - Express-session 每次页面加载都会创建一个新会话
问题描述
我有一个 MERN Web 应用程序express-session
,我正在尝试将其部署到 heroku。package.json
通过在文件中设置代理,我使用代理配置了后端请求。当前端和后端都在本地运行时,它可以正常工作localhost
。
当我将后端部署到 heroku 时,每次浏览器刷新后,express-session 都会在 mongodb 中创建一个新的会话/文档。
经过大量调试后,发现axios.defaults.baseURL
后端 url 的设置导致了问题。(我仍然不知道为什么。)
显然,将代理设置为package.json
唯一适用于开发,因为当我部署应用程序时,会从前端 url 调用 api。因此,在开发过程中,当一切都在 localhost 上运行,并且代理设置在 中时package.json
,一切正常。
问题是,当我设置axios.defaults.baseURL
. 当我这样做时,每次重新加载页面后,都会重新创建会话。
前端连接后端的正确方法是什么?
会话.js
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const mongoose = require('mongoose');
module.exports = function(app) {
var sess = {
secret: 'mySecret',
cookie: { token: null },
saveUninitialized: false,
resave: true,
store: new MongoStore({ mongooseConnection: mongoose.connection })
};
if (app.get('env') === 'production') {
app.set('trust proxy', 1);
sess.cookie.secure = true;
}
app.use(session(sess));
};
路由.js
module.exports = function(app) {
app.use(cors());
app.use(helmet());
require('../middleware/session')(app);
// Other routes...
};
解决方案
可行的方法express-session
是它在本地保存一个引用cookie,当您发送请求时,无论是get、post、put还是delete,该请求都会将该cookie ref与请求一起发送到后端。Express-session
然后看到 cookie 引用,然后从数据存储中获取相应的数据,以便您可以在应用程序中使用它。
设置axios.defaults.baseURL
时,cookie 不会从本地系统发送到后端。发送它的方式是通过设置:
axios.defaults.withCredentials = true;
这样可以确保 cookie 被发送过来。一旦你设置了,那么你将不得不origin
使用 CORS 设置一个特定的,并且你不能使用'*'
.
推荐阅读
- c# - Sikuli4Net无法连接到远程服务器c#
- javascript - 等待套接字时是否可以冻结?
- c# - 如何在 .NET Core 2.1 中使用 System.Security.Principal.WindowsIdentity
- node.js - return 不会终止一个 promise/then 链
- marklogic - 将 CORB 与 Marklogic 8 一起使用
- javascript - 在将文件写入客户端磁盘时从 blob 创建/对象 URL 释放内存
- networking - 在 Gephi 0.9.2 中更改边缘箭头大小
- sql - SQL:Union 中的 Group BY 与 Union All 中的 Group BY
- javascript - 用户表单数据和数据库数据对比MongoDB
- eloqua - 如何使用批量 API 从 Eloqua 导出所有外部活动