node instalar example session mongodb node.js express mongoose

session - instalar - node.js+express.js: manejo de sesión con mongodb/mangosta



node js express mysql session example (7)

En este momento estoy almacenando mis datos de sesión en la "memoria de la tienda" que viene incluida con connect (express). Pero quiero / tengo que cambiar esto para la producción.

La aplicación usa mongodb e instalé mangosta para manejar todas las comunicaciones de DB.

Por ejemplo, conéctese 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 mangosta, o si es realmente 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 de db por segunda vez usando mongodb-module directamente?


Entonces connect-mongodb no usa Mongoose, usa el controlador node-mongodb-native ( es decir: npm install mongodb ). Mangosta también depende de este controlador, por lo que debe estar presente.

Al mirar el código directamente , debe proporcionar su información de conexión de base de datos como un objeto de MongoStore :

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

Normalmente, para esto, querrá tener algún objeto o variable "config" que pueda cargarse dinámicamente (desarrollo vs prueba frente a prod). Luego desconectas el host / port / db / auth de ese objeto de configuración.


Me tropecé con mongoose-session

Muy ligero y trabajado a la perfección para mí. De github ...

Instalación

npm install mongoose-session

Utilizar

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


Para expresar 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 movido a su propio módulo, por lo que debe MongoStore y usarla al configurar MongoStore .


Parece que puedes hacer esto para configurar connect-mongodb suponiendo que tu código de conexión de mangosta se ejecuta antes:

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


Por favor incluya

app.use(express.cookieParser());

directamente antes

app.use(express.session({

De lo contrario, arroja un error como el siguiente,

TypeError: no se puede leer la propiedad ''connect.sid'' de undefined


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: // usuario: [email protected]/db_name.

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

En el último código, puede pasar un identificador a una conexión existente, una instancia de mongodb.Db . Con 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 utilizado aún (o no probado).

Estoy seguro de que si espera el próximo lanzamiento, podrá pasar una conexión de mangosta existente. Mientras tanto, solo tendrás que aceptar tener dos conexiones, una de mangosta y otra de connect-mongodb.

Obtuve la información de conexión de https://github.com/tedeh/connect-mongodb y obtuve la información de manejo de la fuente ( confirmación pertinente ).


al final estoy usando un poco de cada respuesta que se dio antes:

  • cambié de connect-mongodb al módulo connect-mongo
  • Estoy usando un objeto de conf general para almacenar mis datos de configuración
  • Hay dos conexiones de base de datos porque es más fácil de manejar para mí (tal vez se modifiquen más adelante si aparece una nueva versión de mangosta / exprés)

requisitos:

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

objeto de 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 conecta con mongodb por segunda vez usando mangosta:

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