How to share sessions with Socket.IO 1.x and Express 4.x?

后端 未结 6 1105
轮回少年
轮回少年 2020-11-22 15:14

How can I share a session with Socket.io 1.0 and Express 4.x? I use a Redis Store, but I believe it should not matter. I know I have to use a middleware to look at cookies a

6条回答
  •  执笔经年
    2020-11-22 15:31

    Using Bradley Lederholz's answer, this is how I made it work for myself. Please refer to Bradley Lederholz's answer, for more explanation.

    var app = express();
    var server  = require('http').createServer(app);
    var io = require('socket.io');
    var cookieParse = require('cookie-parser')();
    var passport = require('passport');
    var passportInit = passport.initialize();
    var passportSession = passport.session();
    var session = require('express-session');
    var mongoStore = require('connect-mongo')(session);
    var mongoose = require('mongoose');
    var sessionMiddleware = session({
      secret: 'some secret',
      key: 'express.sid',
      resave: true,
      httpOnly: true,
      secure: true,
      ephemeral: true,
      saveUninitialized: true,
      cookie: {},
      store:new mongoStore({
      mongooseConnection: mongoose.connection,
      db: 'mydb'
      });
    });
    
    app.use(sessionMiddleware);
    io = io(server);
    io.use(function(socket, next){
      socket.client.request.originalUrl = socket.client.request.url;
      cookieParse(socket.client.request, socket.client.request.res, next);
    });
    
    io.use(function(socket, next){
      socket.client.request.originalUrl = socket.client.request.url;
      sessionMiddleware(socket.client.request,   socket.client.request.res, next);
    });
    
    io.use(function(socket, next){
      passportInit(socket.client.request, socket.client.request.res, next);
    });
    
    io.use(function(socket, next){
      passportSession(socket.client.request, socket.client.request.res, next);
    });
    
    io.on('connection', function(socket){
      ...
    });
    
    ... 
    server.listen(8000);
    

提交回复
热议问题