如何使用快递创建和阅读会话
我想在用户输入应用程序时创建用户sessison。 并在需要时阅读会议。 这是我的尝试
var io   = require('socket.io'),
    express = require('express');
    querystring = require('querystring');
var app = express.createServer();
app.get('/', function(req, res){
    var sessionVal = querystring.parse(req.url.substr(2));// sessionVal is an email for example: me@gmail.com
    app.use(express.cookieParser());
    app.use(express.session({ secret: sessionVal }));
});
var socket = io.listen(app);
socket.on('connection', function(client) {
    client.on('message', function(message) {
        // message will be an object {text:'user text chat blah blah', email:'me@gmail.com'}
        // if the seesion stored, has the same value with message.email
        // then the message will be broadcasted
            socket.broadcast(message.text);
        // else will not broadcast  
    });
});
app.listen(4000);
  我需要在这里指出你错误地将中间件添加到应用程序中。  app.use调用不应该在app.get请求处理程序内完成,而应该在其外部完成。  只需在createServer之后直接调用它们,或者查看文档中的其他示例即可。 
  你传递给express.session的秘密应该是一个字符串常量,或者可能来自配置文件。  不要喂它客户可能知道的东西,这实际上是危险的。  这只是服务器应该知道的秘密。 
如果您想在会话中存储电子邮件地址,只需执行以下操作:
req.session.email = req.param('email');
随着那个...
如果我理解正确,你要做的就是处理一个或多个HTTP请求并跟踪一个会话,然后再打开一个你需要会话数据的Socket.IO连接。
  关于这个问题有些棘手的问题是,Socket.IO在任何http.Server上制作魔术的手段都是劫持request事件。  因此,Express'(或者说Connect的)会话中间件永远不会在Socket.IO连接上被调用。 
不过,我相信你可以做这个工作,但有些诡计。
  您可以访问Connect的会话数据;  您只需获取对会话存储的引用即可。  最简单的方法是在调用express.session之前亲自创建商店: 
// A MemoryStore is the default, but you probably want something
// more robust for production use.
var store = new express.session.MemoryStore;
app.use(express.session({ secret: 'whatever', store: store }));
  每个会话商店都有一个get(sid, callback)方法。  sid参数或会话ID存储在客户端的cookie中。  该cookie的默认名称是connect.sid 。  (但你可以通过在你的express.session调用中指定一个key选项给它任何名字。) 
  然后,您需要访问Socket.IO连接上的cookie。  不幸的是,Socket.IO似乎没有给你访问http.ServerRequest 。  一个简单的解决方法是在浏览器中获取cookie,并通过Socket.IO连接发送它。 
服务器上的代码将如下所示:
var io      = require('socket.io'),
    express = require('express');
var app    = express.createServer(),
    socket = io.listen(app),
    store  = new express.session.MemoryStore;
app.use(express.cookieParser());
app.use(express.session({ secret: 'something', store: store }));
app.get('/', function(req, res) {
  var old = req.session.email;
  req.session.email = req.param('email');
  res.header('Content-Type', 'text/plain');
  res.send("Email was '" + old + "', now is '" + req.session.email + "'.");
});
socket.on('connection', function(client) {
  // We declare that the first message contains the SID.
  // This is where we handle the first message.
  client.once('message', function(sid) {
    store.get(sid, function(err, session) {
      if (err || !session) {
        // Do some error handling, bail.
        return;
      }
      // Any messages following are your chat messages.
      client.on('message', function(message) {
        if (message.email === session.email) {
          socket.broadcast(message.text);
        }
      });
    });
  });
});
app.listen(4000);
  这假定你只想读取一个现有的会话。  你实际上不能创建或删除会话,因为Socket.IO连接可能没有HTTP响应来发送Set-Cookie头(认为WebSockets)。 
  如果您想编辑会话,那么可能适用于某些会话存储。  例如,CookieStore不起作用,因为它还需要发送Set-Cookie头,但它不能。  但对于其他商店,您可以尝试调用set(sid, data, callback)方法并查看会发生什么。 
我忘记告诉一个错误,当我使用我使用req.session.email = req.param('电子邮件'),服务器错误说不能确定属性电子邮件的undefined。
这个错误的原因是app.use的错误顺序。 您必须按以下顺序配置express:
app.use(express.cookieParser());
app.use(express.session({ secret: sessionVal }));
app.use(app.route);
互操作socket.io和连接会话支持很麻烦。 问题不是因为socket.io“劫持”请求,而是因为某些socket.io传输(我认为flashsockets)不支持cookie。 我可能是错误的饼干,但我的做法如下:
