Node.js connect mongo创建的条目未过期

Node.js connect mongo创建的条目未过期,node.js,mongodb,express,mongoose,passport.js,Node.js,Mongodb,Express,Mongoose,Passport.js,我用Express设置了一个节点服务器,使用Passport进行身份验证。我听说connect mongo很适合用于持久登录会话,所以我已经设置好了,一开始一切都正常,mongo会根据过期时间自动删除用户会话。然而,在生产环境中,对于每个用户会话,还有5000个其他的空会话永远不会过期,我不明白为什么mongo不会自动清理这些会话。mongo中空会话的一个示例条目如下所示: { "_id" : "JMtV5Z1oWRkgh9KIKlwSqwOE", "session" : "{\"cooki

我用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 ) }
以下是快速配置代码:

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 });
});
我认为这些空会话是由搜索机器人创建的,因为我想不出任何其他原因为什么我的网站会在一个晚上被点击20000次。但即便如此,只要会话正确过期,也不会出现问题,我的数据库也不会耗尽内存,但它们永远不会被清理


如果您有任何见解,我们将不胜感激,因为connect mongo似乎工作正常。您将maxAge设置为1000天,这就是存储在cookie中的内容。参见ttl信息

我怀疑您的问题是,您实际上只希望在用户登录时发布cookie,而不是针对任何资产页面、图像、Javascript等的每个请求。。在这种情况下,您可以在express.cookieParser和express.session前面添加可选的第一个参数,以便中间件仅在特定路径上运行,例如/login

或者,您可以将您的express.static中间件移动到express.cookieParser之上,这样就不会为静态资产发布cookie。

阅读文档

删除过期会话

connect mongo使用MongoDB的TTL收集功能2.2+实现 mongod会自动删除过期的会话。mongod开这张支票 每一分钟

注意:根据connect/express的默认设置,会话cookie设置为过期 当用户关闭浏览器时,maxAge:null。按照 标准行业惯例,connect mongo将这些会话设置为 从他们最后的“一套”开始两周后到期。您可以覆盖此行为 通过手动设置cookies的最大值-请记住 任何小于60秒的值都是毫无意义的,因为mongod只会 每分钟删除TTL集合中的过期文档

有关更多信息,请咨询connect的

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

您是否可以使用mongo命令行工具,选择用于会话的数据库(可能仅称为会话),然后在现有集合上运行:db.collectionName.getIndexes并在您的问题中显示它?因为应该有索引来确保mongo根据索引字段使记录过期。
cookie: { maxAge: 24 * 60 * 60 * 1000 }