Kev*_*ard 10 session connect mongodb node.js express
我有一个使用NodeJS,Express,MongoDB和connect-mongo的应用程序.
我的问题是,当MongoDB过期时,会话似乎没有自动删除,因此db大小会增加,直到磁盘已满.
connect-mongo的开发者写了一条评论:
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'));
});
Run Code Online (Sandbox Code Playgroud)
我目前正在运行以下版本:
Ste*_*nie 21
您还没有clear_interval为会话设置.. connect-mongo默认为-1(或"never"):
clear_interval清除过期会话的时间间隔(以秒为单位)(可选,默认值:-1).值<= 0禁用过期的会话清除.
每小时(3600s)删除过期会话的示例:
var sessionStore = new MongoStore({
db: 'myappsession',
clear_interval: 3600
});
Run Code Online (Sandbox Code Playgroud)
您还应确保已将maxAge会话设置为实际到期(例如,使用1天):
app.use(express.session({
secret: "myappsecret",
cookie: { maxAge: 24 * 60 * 60 * 1000 },
store:sessionStore
}));
Run Code Online (Sandbox Code Playgroud)
我不知道这些选项是从哪里获取的,但我正在查看最新版本clear_interval的代码:
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()
}
}
Run Code Online (Sandbox Code Playgroud)
因此,根据该代码设置自动删除的正确方法似乎是:
const store = new MongoStore({
url: "put db connection string here ...",
autoRemove: 'interval',
autoRemoveInterval: 60 * 24 // In minutes. Default
})
Run Code Online (Sandbox Code Playgroud)
我没有看到任何clear_interval选项的痕迹,所以在我看来,建议的解决方案没有效果......