第一页加载时有多个快速会话实例

Multiple express session instances on first page load

我自动给每个用户一个会话,并将会话数据存储在一个名为 sessions 的 MongoDB 集合中。我还设置了一个 cookie,它允许我识别每个(返回的)用户。当用户 returns 时,当 cookie 随请求一起发送时,我能够成功找到我的会话。

除用户第一次访问网站外一切正常。前端(使用 Angular 构建)同时对节点服务器进行六个不同的调用(每个调用都有自己的目的)。由于还没有设置 cookie,节点服务器认为有六个不同的用户调用服务器,由此创建六个会话并将其存储到会话集合中。

下一次调用(在用户操作之后)发生在倒数第二个创建的会话中,以后的每次调用都使用此会话 ID。

如何解决用户第一次访问网站时初始创建六个不同的session?

可以对 "initiate" 会话执行一次调用,并在响应后执行其余的调用。但如果还有其他选择,我真的很想听听。

我正在使用 Express.js 4.0、Node.js v0.10.32 和 MongoDB v2.6.5.

的自定义版本

这是我创建会话和设置 cookie 的方式:

app.use(session({
    saveUninitialized: true,
    resave: true,
    cookie: { secure: false, httpOnly: false },
    name: 'someName',
    secret: 'someScret',
    store: new mongoStore({
        db: framework.mongoose.connection.db,
        collection: 'sessions'
    })
}));

如果您需要更多信息,请告诉我。

我自己想出来了。 OPTIONS 请求存在问题。选项请求不会在 headers 中发送 cookie,这导致在节点服务器上创建新会话。

由于选项请求仅用于检查 cross-domains 的授权,它一定是带有 cors 的东西。我禁用了 cors 并在禁用 cors 的情况下启动了 Chrome。这解决了问题。

请注意:我只为(更简单的)本地开发实现了 cors。我不需要实时服务器上的cors。

这是突击队员(Mac只)打开Google Chrome:

open -a Google\ Chrome --args --disable-web-security
var session = require('express-session');
    app.use(session({
            secret: 'a4f8071f-c873-4447-8ee2',
            cookie: { maxAge: 2628000000 },
            store: new (require('express-sessions'))({
                storage: 'mongodb',
                instance: mongoose, // optional
                //host: 'localhost', // optional
                //port: 27017, // optional
                //db: 'test', // optional
                collection: 'sessions', // optional
                expire: 86400 // optional
            })
        }));

使用快速会话和快速会话