无法从饼干瓦特/ Socket.IO得到Express会话ID(Can't get Expr

2019-07-29 04:36发布

我在节点所使用的高速架构和会话中间件一个典型的Web应用程序。 我也使用Socket.io我的应用程序的某些动态的部分(目前,这是一个聊天机制,但这是切线)。 我已经能够成功地建立了会议,并socket.io自己,而是想将它们组合(EG:与用户帐户插座聊天消息没有击中数据库关联)​​。

应该指出的(我可以看到这是一个可能的问题点),我运行在不同端口的两个Express服务器:一个用于常规的HTTP流量,以及一个用于HTTPS流量。 不过,我有两个服务器进行的idential配置和共享相同的会话存储。 会议就坚持我之间的HTTP和HTTPS网页。 该会议是通过从HTTPS服务页面初始设置和socket.io页面香草HTTP。

我下面位于导在这里实现我所期待的关于整合socket.io和会话。 然而,授权功能中,data.headers.cookie从未设置,尽管我的应用程序如预期工作的基于会话的部分。 更重要的是奇怪的是,设置一个会话之后,如果我做console.log(document.cookie)在浏览器中,我得到一个空字符串,但是当我看到我的cookies与Firefox的开发人员工具栏,有一个SID饼干两个快递和连接。

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

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(不只是一个会话变量)之后,请求的饼干部分仍然不存在。

Answer 1:

我从来没有想到这个直到被告知看在客户端上的初始化。 我从本地主机更改了地址,明确IP(127.0.0.1)和饼干,现正与Socket.IO头发送。 我不知道这是明显与否,我认为是本地主机被映射反正到127.0.0.1。



文章来源: Can't get Express session ID from cookies w/ Socket.IO