node.js + express.js: обработка сеанса с помощью mongodb/mongoose
Вопрос
Прямо сейчас я храню данные о своем сеансе в «Store Memory Store», который поставляется в комплекте с Connect (Express). Но я хочу/должен изменить это для производства.
Приложение использует MongoDB, и я установил Mongoose для обработки всех Communications.
Например, подключитесь к БД после инициализации моего приложения:
var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
app.listen(3000);
}
Я нашел модуль Connect-MongoDB, но я не знаю, как реализовать его с помощью Mongoose, или если это действительно возможно? Мне нужно добавить что -то вроде этого:
var mongoStore = require('connect-mongodb');
// ...
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: 'myDb' })
}));
Или мне нужно определить свое соединение DB во второй раз, используя модуль MongoDB напрямую?
Решение
В конце концов я использую немного каждого ответа, который давал ранее:
- Я переключился с Connect-MongoDB на модуль Connect-Mongo
- Я использую общий объект CONF для хранения данных о конфигурации
- Есть два соединения БД, потому что с ним легче справиться с мной (возможно, позже изменилось, если/когда выйдет новая версия Mongoose/Express)
требования:
var express = require('express'),
MongoStore = require('connect-mongo')(express),
mongo = require('mongoose');
CONF объект:
var conf = {
db: {
db: 'myDb',
host: '192.168.1.111',
port: 6646, // optional, default: 27017
username: 'admin', // optional
password: 'secret', // optional
collection: 'mySessions' // optional, default: sessions
},
secret: '076ee61d63aa10a125ea872411e433b9'
};
Тогда я смогу настроить это так:
app.configure(function(){
// ...
app.use(express.cookieParser());
app.use(express.session({
secret: conf.secret,
maxAge: new Date(Date.now() + 3600000),
store: new MongoStore(conf.db)
}));
// important that this comes after session management
app.use(app.router);
// ...
});
и, наконец, подключитесь к MongoDB во второй раз, используя Mongoose:
var dbUrl = 'mongodb://';
dbUrl += conf.db.username + ':' + conf.db.password + '@';
dbUrl += conf.db.host + ':' + conf.db.port;
dbUrl += '/' + conf.db.db;
mongo.connect(dbUrl);
mongo.connection.on('open', function () {
app.listen(3000);
});
Другие советы
Пожалуйста, укажите
app.use(express.cookieParser());
прямо раньше
app.use(express.session({
В противном случае ошибки бросает, как ниже,
TypeError: не удается прочитать свойство «connect.sid» неопределенного
Похоже, вы могли бы сделать это для настройки connect-mongodb
Предполагая, что ваш код подключения в мангуозе, выше, запускается ранее:
app.use(express.session({
secret: 'topsecret',
maxAge: new Date(Date.now() + 3600000),
store: new mongoStore({ db: mongoose.connections[0].db })
}));
Так connect-mongodb
не использует монгуз, он использует node-mongodb-native
Водитель (т.е.: npm install mongodb
) Монгуз также зависит от этого водителя, поэтому он должен присутствовать.
Смотря на Код напрямую, вы должны предоставить информацию о подключении DB MongoStore
объект:
store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })
Как правило, для этого вам нужно иметь какой -то объект «конфигурации» или переменную, которую можно динамически загружать (DeV против теста против Prod). Затем вы вытаскиваете хост/порт/дБ/аут из этого объекта конфигурации.
Для Express 4x:
var express = require('express'),
session = require('express-session'),
MongoStore = require('connect-mongo')(session),
mongo = require('mongoose');
var conf = {
db: {
db: 'myDb',
host: '192.168.1.111',
port: 6646, // optional, default: 27017
username: 'admin', // optional
password: 'secret', // optional
collection: 'mySessions' // optional, default: sessions
},
secret: '076ee61d63aa10a125ea872411e433b9'
};
app.configure(function(){
app.use(express.cookieParser());
app.use(session({
secret: conf.secret,
maxAge: new Date(Date.now() + 3600000),
store: new MongoStore(conf.db)
}));
});
var dbUrl = 'mongodb://';
dbUrl += conf.db.username + ':' + conf.db.password + '@';
dbUrl += conf.db.host + ':' + conf.db.port;
dbUrl += '/' + conf.db.db;
mongo.connect(dbUrl);
mongo.connection.on('open', function () {
app.listen(3000);
});
session
был перемещен в свой собственный модуль, поэтому вам нужно require
это и используйте session
При настройке MongoStore
.
Вы можете передать объект сведений о подключении (хост, имя пользователя, пароль и т. Д.).
Вы также можете передать URL -адрес подключения, например, mongodb: // user: pass@host.com/db_name.
Оба эти метода автоматически запустит новое соединение, независимо от того, есть ли у вас уже или запустите подключение к мангузе.
В последнем коде вы можете передать ручку с существующим соединением, экземпляр mongodb.Db
. Анкет С мангузом это будет mongoose.connection.db
. Анкет Тем не менее, этот код не в реальном выпуске, и когда я попробовал его, он не сработал. Вероятно, еще не готов к использованию (или непроверенным).
Я уверен, что если вы ждете следующего релиза, вы сможете пройти в существующем соединении с мангуозом. В то же время вам просто нужно принять два соединения, одно из Mongoose и одно от Connect-Mongodb.
Я получил информацию об соединении от https://github.com/tedeh/connect-mongodb И я получил информацию о просмотре источника (соответствующий коммит).
Я просто спотыкаюсь Монгус-сессия
Очень легкий и сработал для меня. От github ...
Монтаж
npm install mongoose-session
Использовать
var express = require('express');
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/db');
var app = express();
app.use(require('express-session')({
key: 'session',
secret: 'SUPER SECRET SECRET',
store: require('mongoose-session')(mongoose)
}));