node.js + express.js: session handling with mongodb/mongoose


Question

Right now i'm storing my session data in the "memory store" which comes bundled with connect(express). But I want/have to change this for production.

The application is using mongodb and I installed mongoose to handle all db-communications.

e.g. Connect to the DB after initializing my app:

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

I found the connect-mongodb module, but I don't know how to implement it using mongoose, or if it's actually possible? I need to add something like this:

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

or do I have to define my db connection a second time using the mongodb-module directly?

1
37
3/18/2013 3:23:53 AM

Accepted Answer

in the end i'm using a bit of every answer that was given before:

  • i switched from connect-mongodb to connect-mongo module
  • i'm using a general conf object to store my configuration data
  • there are two db connections because it's easier to handle for me (maybe changed later on, if/when a new version of mongoose/express comes out)

requirements:

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

then i can configure it like this:

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

and finally connect to mongodb a second time using 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);
});
42
2/16/2014 7:30:58 AM

Please include

app.use(express.cookieParser());

directly before

app.use(express.session({

Otherwise throws error as below,

TypeError: Cannot read property 'connect.sid' of undefined


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon