Храните сеансы в mongodb с помощью connect-mongo и mongoose

Я получаю ошибки влево и вправо, когда пытаюсь настроить хранилище сеансов express.js с помощью mongodb. Я использую локомотив для моей структуры и настроил мангуст.

В моем каталоге инициализаторов для 02_mongoose.js у меня есть это.

module.exports = function() {
    mongoose.connect('mongodb://localhost:27018/basbac');
    mongoose.model('User', UserSchema);
}

Я знаю, что у меня есть соединение с базой данных, потому что я могу подключить своих пользователей к контроллеру.

DeveloperController.show = function() {

var self = this;
var user = mongoose.model('User');

user.find().exec(function(error, users) {

    if(error) {
        console.log(error);
    } else {
        self.res.json({response: { id: self.param('id'), api: self.param('api'), users: users } });    
    }

});

}

http://localhost:3000/developer/test/?api=hhfkgjhukdsfkjhvsduhvudhcsiudvlskejfbk

{
  response: {
  id: "test",
  api: "hhfkgjhukdsfkjhvsduhvudhcsiudvlskejfbk",
  users: [
    {
      _id: "52706695a43c83a739358de5",
      firstname: "cad",
      lastname: "bane",
      address: "duro",
      email: "cad@bane.com"
    },
    {
      _id: "52706695a43c83a739358de6",
      firstname: "jar jar",
      lastname: "binks",
      address: "naboo",
      email: "jarjar@binks.com"
    }
   ]
   }
}

Внутри моего config/all.js у меня есть это как моя конфигурация для сессий

var MongoStore = require('connect-mongo')(express);
var mongoose = require('mongoose');

this.use(express.cookieParser());

this.use(express.session({ 
    secret: 'keyboard cat',
    store: new MongoStore({
        mongoose_connection: mongoose.connection
    }) 
}));

Но это выдает ошибку.

this.db = new mongo.Db(options.mongoose_connection.db.databaseName,
TypeError: Cannot read property 'databaseName' of undefined

Я также пытался сделать это, как документы по connect-mongo, где говорится, но я получаю сообщение об ошибке. ( https://github.com/kcbanner/connect-mongo) mongoose_connection в форме: someMongooseDb.connections[0], чтобы использовать существующее соединение mongoose. (необязательный)

this.use(express.session({ 
    secret: 'keyboard cat',
    store: new MongoStore({
        mongoose_connection: mongoose.connections[0]
    }) 
}));

Но я получаю ту же ошибку, что и раньше.

this.db = new mongo.Db(options.mongoose_connection.db.databaseName,
TypeError: Cannot read property 'databaseName' of undefined

Я также попытался сделать так, как говорят многие статьи. Вот один из примеров рабочей конфигурации ( Выход из системы в ExpressJS, PassportJS и MongoStore)

this.use(express.session({ 
    secret: 'keyboard cat',
    store: new MongoStore({
        db: mongoose.connection.db
    }) 
}));

Но это также приводит к ошибке, и я знаю, что ключ db на самом деле не определен

throw new Error('Required MongoStore option `db` missing');

Что я делаю не так, чтобы передать это соединение в новый MongoStore? Когда я запускаю console.log() объект mongoose, я не могу найти никакой информации о соединении, которое он использует. Я вижу базовый объект, но внутри него нет ключа db. Нужно ли передать еще несколько параметров в конфигурацию мангуста?

1 ответ

Решение

Проблема в том, в каком порядке запускается Локомотив. Согласно документам:

Когда приложение "Локомотив" запускается, оно проходит последовательность шагов:

Настройте среду

На этом шаге выполняется config/environment /all.js, за которым следует файл конфигурации для текущей среды. Например, при запуске в разработке выполняется config/environment /development.js.

Вызов инициализаторов

После настройки среды запускаются инициализаторы. Инициализаторы используются для настройки подсистем и подключения к базам данных, очередям сообщений и другим службам, используемым приложением.

Поэтому, когда вызывается код вашей среды, инициализатор еще не запущен, а Mongoose не настроен. Попробуйте перенести настройку Mongoose в отдельный файл (я использую app/db/mongoose сам, но это вопрос личных предпочтений) и require что в вашем файле среды.

Другие вопросы по тегам