Храните сеансы в 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
что в вашем файле среды.