node.js + express.js: обработка сеанса с помощью mongodb / mongoose - PullRequest
37 голосов
/ 25 июля 2011

Прямо сейчас я храню свои данные сеанса в «хранилище памяти», которое поставляется в комплекте с connect (express). Но я хочу / должен изменить это для производства.

Приложение использует mongodb, и я установил mongoose для обработки всех db-коммуникаций.

например. Подключитесь к БД после инициализации моего приложения:

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

или мне нужно еще раз определить мое соединение с БД, используя модуль mongodb напрямую?

Ответы [ 7 ]

42 голосов
/ 26 июля 2011

В конце я использую немного каждого ответа, который был дан ранее:

  • я переключился с 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);
});
27 голосов
/ 05 сентября 2011

Пожалуйста, включите

app.use(express.cookieParser());

непосредственно перед

app.use(express.session({

В противном случае выдает ошибку, как показано ниже,

Ошибка типа: невозможно прочитать свойство 'connect.sid'неопределенного

7 голосов
/ 25 июля 2011

Похоже, вы могли бы сделать это для настройки connect-mongodb, предполагая, что ваш код подключения mongoose, указанный выше, запускается раньше:

app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: mongoose.connections[0].db })
}));
3 голосов
/ 03 июля 2014

Для экспресс-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.

3 голосов
/ 25 июля 2011

То есть connect-mongodb не использует Mongoose, он использует драйвер node-mongodb-native (, т. Е.: npm install mongodb). Mongoose также зависит от этого драйвера, поэтому он должен присутствовать.

Глядя на код непосредственно , вы должны предоставить информацию о подключении к БД в виде MongoStore объекта:

store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })

Как правило, для этого вам понадобится какой-нибудь объект или переменная «config», которые можно динамически загружать (dev vs test vs prod). Затем вы извлекаете host / port / db / auth из этого объекта конфигурации.

1 голос
/ 26 июля 2011

Вы можете передать объект сведений о соединении (хост, имя пользователя, пароль и т. Д.).

Вы также можете передать URL-адрес соединения, например, mongodb: // user: pass@host.com/db_name.

Оба эти метода автоматически начнут новое соединение, независимо от того, установлено ли у вас соединение с мангустом или нет.

В последнем коде вы можете передать дескрипторк существующему соединению, экземпляр mongodb.Db.С мангустом это будет mongoose.connection.db.Однако этого кода нет в реальной версии, и когда я попробовал его, он не работал.Вероятно, еще не готов к использованию (или не проверено).

Я уверен, что если вы дождетесь следующего выпуска, вы сможете передать существующее соединение с mongoose.В то же время вам просто нужно принять два подключения: одно от mongoose, а другое от connect-mongodb.

Я получил информацию о соединении от https://github.com/tedeh/connect-mongodb и получил информацию о дескрипторе отпросмотр источника ( соответствующий коммит ).

0 голосов
/ 04 июля 2014

Я просто наткнулся на Мангуста-сессия

Очень легкий и без проблем работал для меня. Из 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)
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...