无法从支持Socket.IO的cookie中获取快速会话ID

我在Node中有一个典型的Web应用程序,它使用Express框架和会话中间件。 我也为我的应用程序的某些dynamic部分使用Socket.io(目前,这是一个聊天机制,但这是切线)。 我已经能够自己成功地build立会话和socket.io,但是希望将它们组合(EG:将套接字聊天消息与用户帐户关联而不碰到数据库)。

应该注意(我可以看到这是一个可能的问题点),我在不同的端口上运行两个快速服务器:一个用于常规HTTP通信,另一个用于HTTPS通信。 但是,我正在使两台服务器进行理想的configuration并共享相同的会话存储。 会话确实在http和https页面之间持续存在。 会话最初是通过HTTPS提供的页面设置的,而socket.io页面是vanilla HTTP。

我正在按照这里的指南来实现我正在寻找关于集成socket.io和会话。 但是,在授权函数中,尽pipe我的应用程序的基于会话的部分按预期工作,data.headers.cookie从不设置。 更奇怪的是,在设置会话之后,如果我在浏览器中执行了console.log(document.cookie) ,我得到一个空string,但是当我用Firefox开发人员工具栏查看cookie时,有一个SID cookie的快递和连接。

这里是服务器代码的相关部分:

 var config = { ip : "127.0.0.1", httpPort : 2031, httpsPort : 2032 }; var utils = require("./utils"), express = require('express'), fs = require('fs'), parseCookie = require('./node_modules/express/node_modules/connect').utils.parseCookie, routes = require('./routes')(config); var httpsOpts = { key : fs.readFileSync("cert/server-key.pem").toString(), cert: fs.readFileSync("cert/server-cert.pem").toString() }; var app = express.createServer(), https = express.createServer(httpsOpts), io = require("socket.io").listen(app, { log: false}), helpers = require("./helpers.js"), session = new express.session.MemoryStore(), sessionConfig = express.session({ store : session, secret : 'secret', key : 'express.sid', cookie : {maxAge : 60 * 60 * 1000} }); //share this across http and https configServer(app); configServer(https); //get SID for using sessions with sockets io.set('authorization', function(data, accept){ if(data.headers.cookie){ data.cookie = parseCookie(data.headers.cookie); data.sessionID = data.cookie['express.sid']; } else { return accept("No cookie transmitted", false); } accept(null, true); }); io.sockets.on('connection', function(socket){ //pull out session information in here }); function configServer(server) { server.configure(function(){ server.dynamicHelpers(helpers.dynamicHelpers); server.helpers(helpers.staticHelpers); server.set('view options', { layout: false }); server.set('view engine', 'mustache'); server.set('views', __dirname + '/views'); server.register(".mustache", require('stache')); server.use(express.static(__dirname + '/public')); server.use(express.bodyParser()); server.use(express.cookieParser()); server.use(sessionConfig); }); } 

这里是客户端上的相关代码:

 <script src="/socket.io/socket.io.js"></script> <script type="text/javascript"> $(document).ready(function(){ var socket = io.connect('http://127.0.0.1'); //make sure this isn't localhost! socket.on('server', function(data){ //socket logic is here }); } </script> 

UPDATE

即使在使用SocketIO的页面的路由中手动设置cookie(而不仅仅是会话variables)之后,请求的cookie部分仍然不存在。

我永远不会想到这一点,直到被告知在客户端的初始化。 我将地址从本地主机更改为明确的IP(127.0.0.1),现在正在使用Socket.IO中的标头发送cookie。 我不确定这是否显而易见,因为我认为本地主机映射到127.0.0.1无论如何。