我有一个使用NodeJS,Express,MongoDB和connect-mongo的应用程序。
我的问题是,当MongoDB过期时,会话似乎不会自动从会话中删除,因此数据库大小会增加,直到磁盘已满。
connect-mongo wrote a comment的开发者:
connect-mongo会要求MongoDB删除所有会话 在当前日期之前过期。
但在我的情况下似乎没有发生这种情况。
我的配置是:
var express = require('express');
var MongoStore = require('connect-mongo');
var sessionStore = new MongoStore({db: 'myappsession'});
var app = express.createServer();
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ secret: "myappsecret", store:sessionStore }));
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
我目前正在运行以下版本:
答案 0 :(得分:21)
您还没有为会话设置clear_interval
.. connect-mongo默认值为-1(或“never”):
clear_interval
清除过期会话的秒数(可选,默认值: -1 )。值< = 0禁用过期的会话清除。
每小时(3600s)删除过期会话的示例:
var sessionStore = new MongoStore({
db: 'myappsession',
clear_interval: 3600
});
您还应该确保在会话中设置maxAge
以使其实际到期(例如,使用1天):
app.use(express.session({
secret: "myappsecret",
cookie: { maxAge: 24 * 60 * 60 * 1000 },
store:sessionStore
}));
答案 1 :(得分:1)
我不知道从何处使用clear_interval
选项,但我正在查看latest version的代码:
class MongoStore extends Store {
constructor(options) {
options = options || {}
/* Fallback */
if (options.fallbackMemory && MemoryStore) {
return new MemoryStore()
}
super(options)
/* Options */
this.ttl = options.ttl || 1209600 // 14 days
this.collectionName = options.collection || 'sessions'
this.autoRemove = options.autoRemove || 'native'
this.autoRemoveInterval = options.autoRemoveInterval || 10
this.transformFunctions = computeTransformFunctions(options, true)
// ...
setAutoRemoveAsync() {
const removeQuery = {expires: {$lt: new Date()}}
switch (this.autoRemove) {
case 'native':
return this.collection.createIndex({expires: 1}, {expireAfterSeconds: 0})
case 'interval':
this.timer = setInterval(() => this.collection.remove(removeQuery, {w: 0}), this.autoRemoveInterval * 1000 * 60)
this.timer.unref()
return Promise.resolve()
default:
return Promise.resolve()
}
}
因此根据该代码设置自动删除的正确方法似乎是:
const store = new MongoStore({
url: "put db connection string here ...",
autoRemove: 'interval',
autoRemoveInterval: 60 * 24 // In minutes. Default
})
我看不到任何clear_interval
选项的痕迹,因此在我看来,建议的解决方案没有效果...