我正在使用connect-mongo和express-session来跟踪用户的会话。我有以下代码来设置会话:
app.use(session({
secret: 'scamp',
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: 60 * 30 // half hour
})
}));
这个问题是为发送到服务器的每个请求创建了一个会话。例如,我使用亚马逊网络服务来托管我的应用程序,并且每隔10秒向我的服务器发送一个请求,以确保它仍处于运行状态(称为健康检查)。运行状况检查请求是对mydomain / health的GET请求。但是使用我的代码,这将创建一个新会话,该会话存储在我的远程Mongo Db中的会话集合中。因此数据库非常迅速地增长。
一些背景知识:我的应用程序允许用户上传文件,然后与每个文件进行交互。我只希望会话跟踪用户正在与之交互的CURRENT文件(在我的会话中,我保留当前文件ID,文件路径,当前文件参数等)。基本上,我只想为某些请求设置会话,而不是全部。
所以我想我会重写我的代码:
var setsession = function (req, res, next){
session({
secret: 'scamp',
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: 60 * 30 // half hour
})
})
next();
};
app.use(setsession);
然后我计划在setSession()
内进行检查以查看请求端点是什么,如果请求是我想要会话的其中一个,则设置会话。但是,在更改上面的代码后,这会立即破坏我的应用程序。下面我有:
app.get('/api/canvas', function(req, res) {
sess = req.session;
var callback = function() {
graphController.constructGraph();
};
console.log('req.session is ', req.session);
var graphController = new GraphController(req, res, sess, callback);
});
现在,将session()
移出app.use
并进入自己的方法后,req.session为undefined
,我的应用程序就会中断。知道为什么会这样吗?
此外,这是一种很好的方法来阻止会话存储在API的每个请求上吗?
答案 0 :(得分:1)
如果不包含任何数据,可以使用saveUninitialized
选项来阻止会话保存。
app.use(session({
secret: 'scamp',
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: 60 * 30 // half hour
}),
saveUninitialized: false
}));
强制将“未初始化”的会话保存到商店。会话在新的但未修改时未初始化。选择false对于实施登录会话,减少服务器存储空间使用,或在设置cookie之前遵守需要许可的法律非常有用。选择false也将有助于客户在没有会话的情况下发出多个并行请求的竞争条件。
默认值为true,但不推荐使用默认值,因为默认值将来会更改。请研究此设置并选择适合您的用例的内容。
https://www.npmjs.com/package/express-session#saveuninitialized