如何在Express v4和Socket.io 1.3.2之间共享会话

时间:2015-01-28 00:00:00

标签: javascript node.js express socket.io socket.io-1.0

在过去的几天里,我一直在尝试与socket.io共享一个快速会话,我无法绕过它。我正在使用带有socket.io 1.3.2的express 4.11.1(其他依赖项是express-session 1.10.1,cookie-parser 1.3.3和body-parser 1.10.2)。我基本上是将客户端数据放入来自express的会话中,并希望在socket.io中使用该信息,因为套接字在重新连接时会丢失信息。我所做的基本上是做什么here,但它对我不起作用。

var express = require('express'),
    app = express(),
    session = require('express-session'),
    cookieParser = require('cookie-parser'),
    sessionStore = new session.MemoryStore(),
    bodyParser = require('body-parser');
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 3000;

var sessionMiddleware = session({
  name: 'sid',
  store: sessionStore, // MemoryStore
  secret: 's3cr37',
  saveUninitialized: true,
  resave: true,
});

io.use(function(socket, next) {
  sessionMiddleware(socket.request, socket.request.res, next);
});

app.use(sessionMiddleware);
app.use(bodyParser.json())

server.listen(port, function() {
  console.log('Server listening at port %d', port);
});

app.post('/login', function(req, res){  
  //just storing the info in session
  req.session.username = req.body.user;
  ...
});

io.on('connection', function(socket) {
  //using socket.request.session.username which doesn't work
  ...
});

任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:0)

所以,经过大量的搞乱之后,我想出了如何从socket中的会话中获取值。而不是像这样访问会话的值:

socket.request.session.username

我需要这样做:

var getUsernameFromSession = function(socket) {
  var sessionId = socket.request.sessionID;
  var cookie = JSON.parse(socket.request.sessionStore.sessions[sessionId]);
  return cookie.username;
};

我不确定这有多好,但这对我有用。