【发布时间】:2014-03-12 21:12:38
【问题描述】:
我有一个使用 Express 设置的节点服务器,使用 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 次的任何其他原因。但即便如此,只要会话正确过期就不会出现问题,而且我的数据库不会耗尽内存,但它们永远不会被清理。
任何见解将不胜感激,谢谢
【问题讨论】:
-
您能否使用
mongo命令行工具,选择用于会话的数据库(可能仅称为sessions),然后在现有集合上运行:db.collectionName.getIndexes()并在您的问题中显示它?因为应该有索引来确保 mongo 根据索引字段过期记录。
标签: node.js mongodb express mongoose passport.js