javascript - Getting the current user in express.js, while using socket.io? -
i'm using express framework, , part of web app uses socket.io enable real-time chat. need current user's username, , create room him in it. problem can't find way user info when socket.on('connection') called. here's relevant code have far :
var express = require('express'); var passport = require('passport'); var localstrategy = require('passport-local').strategy; var mongoose = require('mongoose'); var session = require('express-session'); var http = require('http'); var routes = require('./routes/index'); var app = express(); var server = http.createserver(app); var io = require('socket.io')(server); server.listen(4000); app.use(session({secret : 'anything', saveuninitialized: true, resave: true})); app.use(passport.initialize()); app.use(passport.session()); mongoose.connect('mongodb://localhost/my_db'); var schema = mongoose.schema; var userdetail = new schema({ username: string, password: string }, { collection: 'users' }); var userdetails = mongoose.model('users', userdetail); app.use('/', routes); app.use('/users', users); app.post('/login', passport.authenticate('local', { successredirect: '/loginsuccess', failureredirect: '/loginfailure', }) ); io.on('connection', function(socket) { console.log('socket stuff'); var sessionstore = session; var sessionid = socket.handshake.sessionid; sessionstore.get(sessionid, function(err, session) { if(!err) { console.log('no error'); if(session.passport.user) { console.log('this users email address %s', session.passport.user); } } }); socket.emit('newmessage', {content : 'chat message content'}); }); the last function i'm having trouble. when user requests page, can find username req.user, have no idea how when don't have req. code have sessions in io.on('connection') not work @ all, , throws errors, figured i'd keep in show i've tried far.
this has been asked few times older answers found not work anymore. answer lies in parsing socket.handshake.headers.cookie hacky , depend on internals of express-session.
anyways, should work express 4 , socket.io 1.1:
var express = require('express'), session = require('express-session'), cookie = require('cookie'), signature = require('cookie-signature'); var app = express(), store = new session.memorystore(), secret = 'session-secret-key', name = 'connect.sid'; app.use(session({ name: name, secret: secret, store: store, resave: true, saveuninitialized: true })); var server = require('http').createserver(app), io = require('socket.io')(server); io.on('connection', function(socket) { if (socket.handshake && socket.handshake.headers && socket.handshake.headers.cookie) { var raw = cookie.parse(socket.handshake.headers.cookie)[name]; if (raw) { // cookie set express-session begins s: indicates // signed cookie. remove 2 characters before unsigning. socket.sessionid = signature.unsign(raw.slice(2), secret) || undefined; } } if (socket.sessionid) { store.get(socket.sessionid, function(err, session) { console.log(session); }); } });
Comments
Post a Comment