Express-session每次加载页面都会创建一个新会话

时间:2019-06-22 01:32:56

标签: node.js reactjs express axios express-session

我有一个带有express-session的MERN网络应用,我正尝试将其部署到heroku。通过在package.json文件中设置代理,我使用代理配置了后端请求。当前端和后端都在localhost上本地运行时,它应能正常工作。

当我将后端部署到heroku时,在每次浏览器刷新后,express-session在mongodb中创建一个新的会话/文档。

经过大量调试后,发现将axios.defaults.baseURL设置为后端URL引起了问题。 (我仍然不知道为什么。)

显然,在package.json中设置代理只能用于开发,因为在部署应用程序时,会从前端URL调用api。因此,在开发过程中,如果一切都在localhost上运行,并且在package.json中设置了代理,那么一切都会很好。

问题是,当我设置axios.defaults.baseURL时。当我这样做时,则在每次重新加载页面后,都会重新创建会话。

将前端连接到后端的正确方法是什么?

Session.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));
};

Route.js

module.exports = function(app) {
    app.use(cors());
    app.use(helmet());
    require('../middleware/session')(app);
    // Other routes...
};

1 个答案:

答案 0 :(得分:0)

express-session的工作方式是,它在本地保存一个参考cookie,当您发送请求时,无论它是获取,发布,放置还是删除,该请求都会将该cookie ref与请求一起发送到后端。 Express-session然后看到cookie引用,然后从数据存储中获取相应的数据,以便您可以在应用程序中使用它。

设置axios.defaults.baseURL时,不会将cookie从本地系统发送到后端。发送方式是通过设置:

axios.defaults.withCredentials = true;

这可以确保Cookie被发送出去。设置完之后,您将必须为CORS设置特定的origin,并且不能使用'*'