adelura / socket.io-express-solution

http://stackoverflow.com/questions/24679046/expressjssocket-ioexpress-session
23 stars 5 forks source link

how to use your code when using mongo-connect to store sessions in mongodb #2

Open Sarfarazsajjad opened 9 years ago

Sarfarazsajjad commented 9 years ago

i am trying to use your code while saving sessions on mongodb using mongo-connect. here is my code

var cookieParser = require('cookie-parser'); var cookie = require('cookie'); var session = require('express-session'); var MongoStore = require('connect-mongo')(session);

var COOKIE_SECRET = 'secret'; var COOKIE_NAME = 'sid'; // configure Express

app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(logger({path: "expressloggerfile.txt"})); app.use(cookieParser(COOKIE_SECRET));

var settings = { db : db, url : mongoClientConnectionString, ssl : true, cookie_secret : COOKIE_SECRET } app.use(session({ name: COOKIE_NAME, secret: settings.cookie_secret, store: new MongoStore({ db : settings.db, }), resave : true, saveUninitialized : true, cookie: { path: '/', httpOnly: true, secure: false, maxAge: null } }));

app.use(passport.initialize()); app.use(passport.session()); // app.use(app.router); app.use(express.static(__dirname + '/public'));

app.get('/', function(req, res){ res.render('index', { user: req.user,serverAddress : socketClientConnectionString, page:"login" }); });

io.use(function(socket, next) { try { var data = socket.handshake || socket.request; if (! data.headers.cookie) { return next(new Error('Missing cookie headers')); } console.log('cookie header ( %s )', JSON.stringify(data.headers.cookie)); var cookies = cookie.parse(data.headers.cookie); console.log('cookies parsed ( %s )', JSON.stringify(cookies)); if (! cookies[COOKIE_NAME]) { return next(new Error('Missing cookie ' + COOKIE_NAME)); } var sid = cookieParser.signedCookie(cookies[COOKIE_NAME], COOKIE_SECRET); if (! sid) { return next(new Error('Cookie signature is not valid')); } console.log('session ID ( %s )', sid); data.sid = sid; MongoStore.get(sid, function(err, session) { if (err) return next(err); if (! session) return next(new Error('session not found')); data.session = session; next(); }); } catch (err) { console.error(err.stack); next(new Error('Internal server error')); } });

it is giving me error

cookie header ( "utma=111872281.325443184.1409593825.1409593825.1409596029.2; utmz=111872281.1409593825.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); io=Adk7O7RvVoTLwZjlAAAB; _ga=GA1.1.325443184.1409593825; _lang=en; sid=s%3AhL3WpSZhFbXcbzBfQycIAkvrLTmx23H-.P%2BX%2BtixJ6lRg49xycOIT%2FILxb8Ime%2BC8Bc2sywVRs%2Bs" ) cookies parsed ( {"utma":"111872281.325443184.1409593825.1409593825.1409596029.2","utmz":"111872281.1409593825.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)","io":"Adk7O7RvVoTLwZjlAAAB","_ga":"GA1.1.325443184.1409593825","_lang":"en","sid":"s:hL3WpSZhFbXcbzBfQycIAkvrLTmx23H-.P+X+tixJ6lRg49xycOIT/ILxb8Ime+C8Bc2sywVRs+s"} ) session ID ( hL3WpSZhFbXcbzBfQycIAkvrLTmx23H- ) TypeError: Object function MongoStore(options, callback) { options = options || {}; Store.call(this, options);

if(options.url) {
  var db_url = url.parse(options.url);

  if (db_url.port) {
    options.port = parseInt(db_url.port);
  }

  if (db_url.pathname != undefined) {
    var pathname = db_url.pathname.split('/');

    if (pathname.length >= 2 && pathname[1]) {
      options.db = pathname[1];
    }

    if (pathname.length >= 3 && pathname[2]) {
      options.collection = pathname[2];
    }
  }

  if (db_url.hostname != undefined) {
    options.host = db_url.hostname;
  }

  if (db_url.auth != undefined) {
    var auth = db_url.auth.split(':');

    if (auth.length >= 1) {
      options.username = auth[0];
    }

    if (auth.length >= 2) {
      options.password = auth[1];
    }
  }
}

if (options.mongoose_connection){
  if (options.mongoose_connection.user && options.mongoose_connection.pass) {
    options.username = options.mongoose_connection.user;
    options.password = options.mongoose_connection.pass;
  }

  this.db = new mongo.Db(options.mongoose_connection.db.databaseName,
                         new mongo.Server(options.mongoose_connection.db.serverConfig.host,
                                          options.mongoose_connection.db.serverConfig.port,
                                          options.mongoose_connection.db.serverConfig.options
                                         ),
                         { w: options.w || defaultOptions.w });

} else {
  if(!options.db) {
    throw new Error('Required MongoStore option `db` missing');
  }

  if (typeof options.db == "object") {
    this.db = options.db; // Assume it's an instantiated DB Object
  } else {

    var serverOptions = options.server || {};
    serverOptions.auto_reconnect = serverOptions.auto_reconnect || options.auto_reconnect || defaultOptions.auto_reconnect;
    serverOptions.ssl = serverOptions.ssl || options.ssl || defaultOptions.ssl;

    this.db = new mongo.Db(options.db,
                           new mongo.Server(options.host || defaultOptions.host,
                                            options.port || defaultOptions.port,
                                            serverOptions),
                           { w: options.w || defaultOptions.w });
  }
}

this.db_collection_name = options.collection || defaultOptions.collection;

if (options.hasOwnProperty('stringify') ? options.stringify : defaultOptions.stringify) {
  this._serialize_session = JSON.stringify;
  this._unserialize_session = JSON.parse;
} else {

  // Copy each property of the session to a new object

  this._serialize_session = function(session) {
    var obj = {};
    for (var prop in session) {
      if (prop === 'cookie') {

        // Convert the cookie instance to an object, if possible
        // This gets rid of the duplicate object under session.cookie.data property

        obj.cookie = session.cookie.toJSON ? session.cookie.toJSON() : session.cookie;
      } else {
        obj[prop] = session[prop];
      }
    }

    return obj;
  };

  this._unserialize_session = function(x) { return x; };
}

var self = this;

this._get_collection = function(callback) {
  if (self.collection) {
    callback && callback(self.collection);
  } else if (self.db.openCalled) {
    self.db.collection(self.db_collection_name, function(err, collection) {
      if (err) {
        throw new Error('Error getting collection: ' + self.db_collection_name);
      } else {
        self.collection = collection;

        // Make sure we have a TTL index on "expires", so mongod will automatically
        // remove expired sessions. expireAfterSeconds is set to 0 because we want 
        // mongo to remove anything expired without any additional delay.
        self.collection.ensureIndex({expires: 1}, {expireAfterSeconds: 0}, function(err, result) {
          if (err) {
            throw new Error('Error setting TTL index on collection : ' + self.db_collection_name);
          }

          callback && callback(self.collection);
        });
      }     
    });    
  } else {
    self._open_database(callback);
  }
};

this._open_database = function(cb){
  self.db.open(function(err, db) {
    if (err) {
      if (!(err instanceof Error)) { err = new Error(String(err)); }
      err.message = 'Error connecting to database: ' + err.message;
      throw err;
    }

    if (options.username && options.password) {
      db.authenticate(options.username, options.password, function () {
        self._get_collection(cb);
      });
    } else {
      self._get_collection(cb);
    }
  });
};

this.defaultExpirationTime = options.defaultExpirationTime || defaultOptions.defaultExpirationTime;

callback && this._open_database(callback);

} has no method 'get'

adelura commented 9 years ago

Hi @Sarfarazsajjad, thank you for your question. I see that you already forked this repo. Please commit your changes into it. It will make running your example easier and we will se what we can do with it. If we will get into solution with your issue I could merge your solution into repositiory as an example for others.