2014-03-27 61 views
18

最初,此錯誤消息開始出現很少,但開始出現更經常,現在出現4/5次我運行我的應用程序。MongoDB:錯誤設置集合上的TTL索引:會話

我正在使用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 
})); 

db.version()從蒙戈外殼的代碼,我跑2.4.9和我使用的connect-mongo版本0.4.0。

似乎有很多人遇到過這個問題,但似乎大多數人都認爲是憑證問題,我的本地mongo沒有通過身份驗證進行安全保護,所以這不成問題。有任何想法嗎?

+4

我已經處理了一段時間,基本上發生了什麼事是Express在MongoDB連接實際連接之前試圖訪問sesssion存儲。給我幾分鐘,我將添加一個使用'connect-mongo'的現有連接的例子。 –

+0

添加了幾個示例。您並不總是必須使用另一個庫的MongoDB連接,但構造函數顯然也會在完全連接時接受回調。 –

回答

25

正如我在評論中所說的,Express會在會話存儲完全連接之前接收連接。解決方案是在允許應用程序開始收聽之前等待連接發生。

您可以通過在創建MongoStore時使用回調或傳入已激活的連接來避免此問題。

例使用connect-mongo的回調

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(); 
}); 

簡單的貓鼬例

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(); 
}); 
+1

這只是在一個有趣的情況下拯救了我的**。我*開始*遇到這個錯誤後,我加快了我的整個客戶端/ e2e /服務器測試套件在我最新的[generator-angular-fullstack](https://github.com/DaftMonk/generator-angular-完整堆棧)MEAN堆棧應用程序。好的解決方案 – charneykaye

+1

@outrightmental你是如何在發生器角度全堆中解決這個問題的? – chovy

+0

我發佈了一個解決方案喲angular-fullstack發電機 –

6

升級連接 - 蒙戈版本0.8.0這爲我工作。

+0

它適用於我。謝謝。 –

+0

也爲我工作 – jotadepicas

+0

當我說'npm install mongo-connect --save'終端安裝了0.6。0版本,我不知道爲什麼我的npm有時會安裝較低版本的軟件包。無論如何,但它與版本0.6.0感謝 – developer

0

角fullstack例如

It's只是封裝了所有其他的東西了mongoose.connect回調函數內

見我服務器/ 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; 

}); 

希望能幫助到你!!