how to use your code when using mongo-connect to store sessions in mongodb
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'
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.