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

Node.js + express.js: обработка сеанса с помощью mongodb/mongoose

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

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

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

var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
  app.listen(3000);
}

Я нашел модуль connect-mongodb, но я не знаю, как его реализовать с помощью мангуста, или если это действительно возможно? Мне нужно добавить что-то вроде этого:

var mongoStore = require('connect-mongodb');
// ...
app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: 'myDb' })
}));

или мне нужно определить мое соединение db во второй раз с помощью модуля mongodb напрямую?

4b9b3361

Ответ 1

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

  • Я переключился с connect-mongodb на модуль connect-mongo.
  • Я использую общий объект conf для хранения данных конфигурации.
  • есть два подключения к db, потому что он легче обрабатывать для меня (возможно, позже будет изменен, если/когда выйдет новая версия mongoose/express)

требования:

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

conf object:

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 во второй раз с помощью мангуста:

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

Ответ 2

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

app.use(express.cookieParser());

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

app.use(express.session({

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

TypeError: Не удается прочитать свойство "connect.sid" из undefined

Ответ 3

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

app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: mongoose.connections[0].db })
}));

Ответ 4

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

Посмотрев код непосредственно, вам необходимо предоставить информацию о соединении с DB как объект MongoStore:

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

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

Ответ 5

Для выражения 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.

Ответ 6

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

Вы также можете передать URL-адрес соединения, например mongodb://user: [email protected]/db_name.

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

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

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

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

Ответ 7

Я просто наткнулся на mongoose-session

Очень легкий и легко работал у меня. Из 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)
}));