我自动为每个用户提供会话并将会话数据存储在名为sessions
的MongoDB集合中。我还设置了一个cookie,允许我识别每个(返回)用户。当用户返回时,我成功地能够在随请求发送cookie时找到我的会话。
一切正常,期待用户第一次访问该网站。前端(使用Angular构建)可以同时向节点服务器发出六个不同的呼叫(每个呼叫都有自己的用途)。由于尚未设置cookie,节点服务器认为有六个不同的用户呼叫服务器,通过该服务器创建六个会话并将其存储到会话集合中。
下一次调用(在用户操作之后)发生在倒数第二个创建的会话中,并且每个将来的调用都是使用此会话ID进行的。
当用户第一次访问网站时,如何解决六个不同会话的初始创建?
可以执行一次调用"启动"会话并在响应后执行其余的操作。但如果还有其他选择,我真的很想听听。
我正在使用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'
})
}));
如果您需要更多信息,请告诉我们。
答案 0 :(得分:2)
我自己想通了。 OPTIONS
次请求存在问题。选项请求不会在其标头中发送cookie,导致在节点服务器上创建新会话。
由于选项请求仅用于检查跨域的授权,因此它必须与cors有关。我禁用了cors并启动了Chrome,禁用了cors。这解决了这个问题。
请注意:我只为(更容易)本地开发实施了角色。我不需要在实时服务器上使用cors。
这是打开谷歌浏览器的突击队员( Mac only ):
open -a Google\ Chrome --args --disable-web-security
答案 1 :(得分:0)
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
})
}));
使用快速会话和快速会话