MongoDB:在集合:会话上设置TTL索引时出错

最初这个错误消息开始出现很less,但开始出现更经常,现在出现4/5次我运行我的应用程序。

我正在处理我的会话存储与Mongo,据我所知,TTL索引是用来使会话数据过期。

/home/dan/dev/audio-wave/node_modules/connect-mongo/lib/connect-mongo.js:161 throw new Error('Error setting TTL index on collection : ' + s ^ Error: Error setting TTL index on collection : sessions at /home/dan/dev/audio-wave/node_modules/connect-mongo/lib/connect-mongo.js:161:23 at /home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/db.js:1404:28 at /home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/db.js:1542:30 at /home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/cursor.js:159:22 at commandHandler (/home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/cursor.js:678:48) at Db._executeQueryCommand (/home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/db.js:1802:12) at Cursor.nextObject (/home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/cursor.js:729:13) at Cursor.toArray (/home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/cursor.js:158:10) at Cursor.toArray (/home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/scope.js:10:20) at /home/dan/dev/audio-wave/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/db.js:1541:65 

以下是将它们联系在一起的代码

 var sessionStore = new MongoStore({ db: 'audio-drop' }) , cookieParser = express.cookieParser('waytoblue') , SessionSockets = require('session.socket.io') , sockets = new SessionSockets(io, sessionStore, cookieParser); app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.logger('dev')); app.use(cookieParser); app.use(express.session({ store: sessionStore })); 

根据Mongo shell的db.version() ,我正在运行2.4.9,并且使用了connect-mongo 0.4.0版本。

似乎有一些人遇到了这个问题,但似乎他们中的大多数是解决证书问题,我当地的mongo没有安全的身份validation,所以这不成问题。 有任何想法吗?

       

网上收集的解决方案 "MongoDB:在集合:会话上设置TTL索引时出错"

正如我在您的评论中所说的,Express会在会话存储完全连接之前接收连接。 解决scheme是在允许应用程序开始监听之前等待连接。

您可以通过在创buildMongoStore时使用callback,或者传递一个已经激活的连接来避免这个问题。

示例使用connect-mongo的callback

 var sessionStore = new MongoStore({ url: 'someConnectionUrl', db: 'audio-drop' }, function(e) { var cookieParser = express.cookieParser('waytoblue'); app.use(cookieParser); app.use(express.session({ store: sessionStore })); app.listen(); }); 

简单的mongoose例子

 var mongoose = require('mongoose'); mongoose.connect('localhost', function(e) { // If error connecting if(e) throw e; var sessionStore = new MongoStore({ mongoose_connection: mongoose.connection }), cookieParser = express.cookieParser('waytoblue'); app.use(cookieParser); app.use(express.session({ store: sessionStore })); app.listen(); }); 

升级到连接mongo版本0.8.0为我工作。

angular度的完整的例子

这只是将所有其他的东西封装在mongoose.connectcallback函数中

看我的服务器/ app.js

 /** * Main application file */ 'use strict'; // Set default node environment to development process.env.NODE_ENV = process.env.NODE_ENV || 'development'; var express = require('express'); var mongoose = require('mongoose'); var config = require('./config/environment'); // Connect to database mongoose.connect(config.mongo.uri, config.mongo.options , function(e){ // Populate DB with sample data if(config.seedDB) { require('./config/seed'); } // Setup server var app = express(); var server = require('http').createServer(app); var socketio = require('socket.io')(server, { serveClient: (config.env === 'production') ? false : true, path: '/socket.io-client' }); require('./config/socketio')(socketio); require('./config/express')(app); require('./routes')(app); // Start server server.listen(config.port, config.ip, function () { console.log('Express server listening on %d, in %s mode', config.port, app.get('env')); }); // Expose app exports = module.exports = app; }); 

希望能帮助到你!!