connect-mongo创build的条目不会过期

我有一个使用Express设置的节点服务器,使用Passport进行身份validation。 我听说connect-mongo可以很好地用于持久login会话,所以我build立了一切,似乎一切正常,用户会话被mongo根据过期时间自动删除。 但是,在生产中,每个用户会话都有5000个其他空会话永不过期,我不知道为什么mongo不会自动清理这些会话。 mongo中的空会话示例如下所示:

{ "_id" : "JMtV5Z1oWRkgh9KIKlwSqwOE", "session" : "{\"cookie\":{\"originalMaxAge\":86400000,\"expires\":\"2014-02-13T22:09:09.948Z\",\"httpOnly\":true,\"path\":\"/\"},\"passport\":{}}", "expires" : Date( 1392329349948 ) } 

这是Expressconfiguration代码:

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

我想这些空洞的会议是从search机器人创build的,因为我想不出为什么我的网站会在一个晚上被打2万次的任何其他原因。 但即便如此,只要会话正确过期,这不会是一个问题,我的数据库不会耗尽内存,但他们永远不会被清理。

任何有识之士将不胜感激,谢谢

connect-mongo似乎工作正常。 您将maxAge设置为1000天,这就是存储在cookie中的内容。 在这里看到ttl信息。

我怀疑你的问题是,你实际上只想在用户login时发出cookie,而不是任何资产(页面,图像,Javascript等)的每个请求。 在这种情况下,可以在express.cookieParser和express.session前面添加一个可选的第一个参数,以便该中间件仅在某些path上运行(例如/ login)。

或者,您可以将express.static中间件移动到express.cookieParser上方,然后不会为静态资产发布Cookie。

阅读这里的文档

删除过期的会话

connect-mongo使用MongoDB的TTL收集function(2.2+)让mongod自动删除过期的会话。 (mongod每分钟运行一次这个检查。)

注意:通过connect / express的默认设置,会话cookie在用户closures浏览器时设置为过期(maxAge:null)。 按照标准的行业惯例,connect-mongo会将这些会话设置为从上一次“设置”起两周后过期。 您可以通过手动为您的cookie设置maxAge来覆盖此行为 – 请记住,任何小于60秒的值都是毫无意义的,因为mongod只会每分钟删除一个TTL集合中过期的文档。

有关更多信息,请参阅connect的会话文档

 cookie: { maxAge: 24 * 60 * 60 * 1000 } 

您正在设置1000天的Cookie到期时间,因此会话不会过期。 您可以将其设置为一天或两天的较低值。