Подтвердить что ты не робот

MongoDB: ошибка установки TTL-индекса в коллекции: сеансы

Изначально это сообщение об ошибке начало появляться очень редко, но стало появляться более регулярно и теперь появляется 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
}));

Согласно db.version() из оболочки Mongo, я запускаю 2.4.9, и я использую версию 0.4.0 connect-mongo.

Кажется, что есть несколько людей, которые столкнулись с этой проблемой, но похоже, что большинство из них решили решить проблему с полномочиями, мой локальный монго не защищен аутентификацией, поэтому это не может быть проблемой. Любые идеи?

4b9b3361

Ответ 1

Как я уже сказал в вашем комментарии, по существу 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();
});

Пример Simple 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();
});

Ответ 2

Модернизируйте для подключения-монго версии 0.8.0, которая сработала для меня.

Ответ 3

angular пример fullstack

Это просто инкапсулировать все остальные элементы внутри функции обратного вызова mongoose.connect

Смотрите мой сервер/приложение .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;

});

Надеюсь, что это поможет!