Pregunta

En este momento estoy almacenando mis datos de sesión en el "almacén de memoria" que viene incluido con Connect (Express). Pero quiero/tengo que cambiar esto para la producción.

La aplicación está utilizando MongoDB y instalé Mongoose para manejar todas las comunicaciones de DB.

por ejemplo, conectarse al DB después de inicializar mi aplicación:

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

Encontré el módulo Connect-MongoDB, pero no sé cómo implementarlo usando Mongoose, o si realmente es posible. Necesito agregar algo como esto:

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

¿O tengo que definir mi conexión DB por segunda vez usando el módulo MongoDB directamente?

¿Fue útil?

Solución

Al final estoy usando una poco de cada respuesta que se dio antes:

  • Cambié de Connect-MongoDB al módulo Connect-Mongo
  • Estoy usando un objeto confl general para almacenar mis datos de configuración
  • Hay dos conexiones DB porque es más fácil de manejar para mí (tal vez cambiado más adelante, si/cuando sale una nueva versión de Mongoose/Express)

Requisitos:

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

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

Entonces puedo configurarlo así:

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

Y finalmente conectarse a MongoDB por segunda vez usando 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);
});

Otros consejos

Por favor incluya

app.use(express.cookieParser());

directamente antes

app.use(express.session({

De lo contrario, arroja error como se muestra a continuación,

TypeError: no se puede leer la propiedad 'Connect.sid' de indefinido

Parece que podrías hacer esto para configurar connect-mongodb Suponiendo que su código de conexión de mangosta anterior se ejecute anteriormente:

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

Asi que connect-mongodb no usa mangosta, usa el node-mongodb-native conductor (es decir: npm install mongodb). La mangosta también depende de este controlador, por lo que debería estar presente.

Mirando a el código directamente, debe proporcionar su información de conexión DB como un MongoStore objeto:

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

Por lo general, para esto, querrá tener algún objeto o variable "config" que se pueda cargar dinámicamente (Dev vs Test vs ProD). Luego extrae el host/puerto/db/auth off de ese objeto de configuración.

Para 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 se ha trasladado a su propio módulo, por lo que necesita require es y usa session Al configurar el MongoStore.

Puede pasar un objeto de detalles de conexión (host, nombre de usuario, contraseña, etc.).

También puede pasar una URL de conexión como MongoDB: // User: pass@host.com/db_name.

Ambos métodos iniciarán automáticamente una nueva conexión, independientemente de si ya tiene o no iniciar una conexión de mangosta.

En el último código, puede pasar un mango a una conexión existente, una instancia de mongodb.Db. Con la mangosta, esto sería mongoose.connection.db. Sin embargo, este código no está en una versión real, y cuando lo probé, no funcionó. Probablemente no esté listo para ser usado todavía (o no probado).

Estoy seguro de que si esperas el próximo lanzamiento, podrás pasar una conexión de mangostos existente. Mientras tanto, solo necesitará aceptar tener dos conexiones, una de Mongoose y otra de Connect-MongoDB.

Obtuve la información de conexión de https://github.com/tedeh/connect-mongodb y obtuve la información del mango de ver la fuente (compromiso relevante).

Solo me topo sesión de mangosta

Muy liviano y trabajó sin problemas para mí. De Github ...

Instalación

npm install mongoose-session

Usar

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)
}));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top