Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Can';无法从Cookie w/Socket.IO获取快速会话ID_Javascript_Node.js_Express_Socket.io_Session Cookies - Fatal编程技术网

Javascript Can';无法从Cookie w/Socket.IO获取快速会话ID

Javascript Can';无法从Cookie w/Socket.IO获取快速会话ID,javascript,node.js,express,socket.io,session-cookies,Javascript,Node.js,Express,Socket.io,Session Cookies,我在Node中有一个典型的web应用程序,它利用了Express框架和会话中间件。我还将Socket.io用于我的应用程序的某些动态部分(目前,这是一种聊天机制,但并不重要)。我已经能够成功地自行设置会话和socket.io,但希望将它们结合起来(例如:在不访问数据库的情况下将socket聊天消息与用户帐户关联) 应该注意的是(我可以看出这是一个可能的问题),我在不同的端口上运行两个express服务器:一个用于常规HTTP流量,另一个用于HTTPS流量。但是,我让两台服务器进行相同的配置,并共

我在Node中有一个典型的web应用程序,它利用了Express框架和会话中间件。我还将Socket.io用于我的应用程序的某些动态部分(目前,这是一种聊天机制,但并不重要)。我已经能够成功地自行设置会话和socket.io,但希望将它们结合起来(例如:在不访问数据库的情况下将socket聊天消息与用户帐户关联)

应该注意的是(我可以看出这是一个可能的问题),我在不同的端口上运行两个express服务器:一个用于常规HTTP流量,另一个用于HTTPS流量。但是,我让两台服务器进行相同的配置,并共享相同的会话存储。会话在http和https页面之间持续存在。会话最初是通过HTTPS提供的页面设置的,socket.io页面是普通HTTP

我正在遵循找到的指南,以实现我所寻找的有关集成socket.io和会话的内容。但是,在授权函数中,从未设置data.headers.cookie,尽管我的应用程序中基于会话的部分按预期工作。更奇怪的是,在设置会话之后,如果我在浏览器中执行
console.log(document.cookie)
,我会得到一个空字符串,但是当我使用Firefox开发者工具栏查看cookie时,express和connect都有一个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>

$(文档).ready(函数(){
var socket=io.connect('http://127.0.0.1“);//确保这不是本地主机!
socket.on('server',函数(数据){
//这里是套接字逻辑
});
}
更新


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

在被告知查看客户端的初始化之前,我从未想到过这一点。我将地址从localhost更改为显式IP(127.0.0.1)Cookie现在与Socket.IO中的头一起发送。我不确定这是否明显,因为我假设localhost已映射到127.0.0.1。

没错!这就是我想要客户端代码的原因。您也可以使用
var Socket=IO.connect();
完全不提供主机。应该可以。是的,正如@freakish提到的,始终使用最小连接客户端代码:
var socket=io.connect()