我使用Express设置了一个Node服务器,使用Passport进行身份验证。我听说connect-mongo很适合用于持久登录会话,所以我设置好了,一开始看起来一切正常,用户会话根据过期时间由mongo自动删除。但是,在生产中,对于每个用户会话,还有5000个永不过期的空会话,我无法弄清楚为什么mongo不会自动清理它们。 mongo中空会话的示例条目如下所示:
{ "_id" : "JMtV5Z1oWRkgh9KIKlwSqwOE",
"session" : "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-02-13T22:09:09.948Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}",
"expires" : Date( 1392329349948 ) }
以下是Express配置代码:
var express = require('express')
, passport = require('passport')
, fs = require('fs')
, http = require('http')
, https = require('https')
, util = require('util')
, mongoose = require('mongoose')
, MongoStore = require('connect-mongo')(express)
, FacebookStrategy = require('passport-facebook').Strategy
, LocalStrategy = require('passport-local').Strategy;
app.configure(function() {
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.logger());
app.use(requireHTTPS);
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.session({
secret: 'asdfasdf',
cookie: { maxAge: 24 * 60 * 60 * 1000 },
store: new MongoStore({
mongoose_connection: mongoose.connections[0],
clear_interval: 3600
}, function(err){
console.log(err || 'connect-mongodb setup ok');
}
)
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(__dirname + '/public'), { maxAge: 31557600000 });
});
我认为这些空会话是从搜索机器人创建的,因为我想不出为什么我的网站会在一夜之间被击中20,000次的任何其他原因。但即便如此,只要会话正确到期就不会有问题,我的数据库也不会耗尽内存,但它们永远不会被清除。
任何见解都将不胜感激,谢谢
答案 0 :(得分:5)
connect-mongo似乎工作正常。您将maxAge设置为1000天,这就是存储在cookie中的内容。请参阅ttl info here。
我怀疑你的问题是你实际上只想要在用户登录时发出cookie,而不是任何资产的每个请求(页面,图像,Javascript等)。在这种情况下,您可以在express.cookieParser和express.session前添加可选的第一个参数,以便该中间件仅在某些路径上运行(例如/ login)。
或者,您可以将express.static中间件移至express.cookieParser上方,然后不会为静态资产发布cookie。
答案 1 :(得分:3)
阅读文档here
删除过期的会话
connect-mongo使用MongoDB的TTL集合功能(2.2+) mongod会自动删除过期的会话。 (mongod运行此检查 每一分钟。)
注意:通过connect / express的默认设置,会话cookie设置为过期 当用户关闭浏览器时(maxAge:null)。依据 标准的行业惯例,connect-mongo将设置这些会话 从最后一次'套装'到期两周。您可以覆盖此行为 通过手动设置cookie的maxAge - 请记住 任何小于60秒的值都是毫无意义的,因为mongod只会 每分钟删除一个TTL集合中的过期文档。
有关详细信息,请参阅connect session documentation
cookie: { maxAge: 24 * 60 * 60 * 1000 }
您设置的Cookie到期时间为1000天,因此会话未获得 过期。您可以将其设置为较低的值,如一两天。