node.js + express.js: manejo de la sesión con MongoDB/Mongoose
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?
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)
}));