Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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 nodejs的新成员。什么是PHP';在nodejs中的会话_start()?_Javascript_Node.js_Sockets_Session - Fatal编程技术网

Javascript nodejs的新成员。什么是PHP';在nodejs中的会话_start()?

Javascript nodejs的新成员。什么是PHP';在nodejs中的会话_start()?,javascript,node.js,sockets,session,Javascript,Node.js,Sockets,Session,我想生成一个会话id,但它对浏览器是唯一的,而不是每个选项卡 我能找到的就是这种类型的东西>> 它演示了如何使用会话存储数据,但在每个选项卡中都有限制,最后会出现一个新会话。我想要的是,浏览器获得一个唯一的会话id,该id自动生成并可从其他选项卡访问。在浏览器存储成熟到大多数用户都拥有该功能之前,暂时不要使用浏览器存储。因为我们仍然有相当多的用户使用不支持本地存储的旧浏览器,所以随机会话id是理想的 我使用这个唯一的id作为私人“聊天室”,聊天程序的用户将加入该“聊天室”以获得支持。每个用户都

我想生成一个会话id,但它对浏览器是唯一的,而不是每个选项卡

我能找到的就是这种类型的东西>>

它演示了如何使用会话存储数据,但在每个选项卡中都有限制,最后会出现一个新会话。我想要的是,浏览器获得一个唯一的会话id,该id自动生成并可从其他选项卡访问。在浏览器存储成熟到大多数用户都拥有该功能之前,暂时不要使用浏览器存储。因为我们仍然有相当多的用户使用不支持本地存储的旧浏览器,所以随机会话id是理想的

我使用这个唯一的id作为私人“聊天室”,聊天程序的用户将加入该“聊天室”以获得支持。每个用户都将在自己的私人房间中,但可以通过选项卡访问同一个房间。我知道这有点草率,但从nodejs的初学者的角度来看,使用浏览器实例的某个唯一键要比处理跨选项卡套接字打开/关闭检测等简单得多。我意识到,使用这种方法,每个选项卡都有自己的到服务器的套接字连接,我现在还可以

我尝试了以下方法(在我看来,它将使用套接字会话,而不是浏览器会话,即使它确实工作),但不工作(对于有经验的人来说,这可能是不工作的原因)

客户

socket.on('connect', function() {
    socket.emit('set room', this.socket.sessionid);
})
服务器

socket.on('set room', function(room) {
    socket.join(room);
    console.log('joined : ' + room);
});
下面是一个简单的脚本示例,以及使用为使用
express sessions
提供的答案所发生的情况。socket.io无法正常运行,或者出现了严重问题:

(删除了会话的
app.use(function…)
,因为它导致客户端永远无法连接到套接字


app.js

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    session = require('express-session');

var settings = require('./settings.json');

server.listen(settings.port);

app.use(session({
    secret: settings.secret,
    resave: false,
    saveUninitialized: true
}));

//app.use(function(req, res, next) {
//  var sess = req.session;
//  if(!sess.id) {
//      sess.id = sess.sessionID;
//  }
//});

app.get('/', function(request, response){
    validateHost('index.html', request, response);
});

io.sockets.on('connection', function(socket){


    socket.on('send message', function(data){
        //io.sockets.emit('new message', data);
        console.log(session.sessionID);
        io.sockets.emit('new message', 'session:' + session.sessionID);
        socket.broadcast.to(socket.room).emit('new message', data);
    });

    socket.on('set room', function(room) {
        socket.join(room);
        console.log('joined : ' + room);
    });

    socket.on('disconnect', function(){
        console.log('user disconnected');
    });

});

function validateHost(file, request, response) {
    var hostname = ( request.headers.host.match(/:/g) ) ? request.headers.host.slice( 0, request.headers.host.indexOf(":") ) : request.headers.host;
//  var file = 'index.html';

    if(settings.hosts.indexOf(hostname)) {
        response.sendFile(__dirname + '/' + file);
    } else {
        response.statusCode = 404;
        response.write('Access Denied to ' + request.headers.host + ' ' + file);
        response.end();
    }
}
index.html

<html>
<head>
    <title>Realtime Private Chat</title>
    <style>
        #chat { height: 200px; width: 300px; overflow-y: auto; overflow-x: hidden; }
        #chat p { width: 270px; }

        .commentArea {
            font: 14px Arial;
            padding: 0 10px;
            margin-top: 20px;    
        }

        .bubbledLeft,.bubbledRight {
            margin-top: 20px;
            padding: 5px 9px;
            max-width: 50%;
            clear: both;
            position: relative;
        }

        .bubbledLeft{
            float: left;
            margin-right: auto;
            -webkit-border-radius: 8px 8px 8px 0px;
            -moz-border-radius: 8px 8px 8px 0px;
            -o-border-radius: 8px 8px 8px 0px;
            -ms-border-radius: 8px 8px 8px 0px;
            border-radius: 8px 8px 8px 0px;
            background-color: #65B045;
            color: #ffffff;
        }

        .bubbledLeft:before {
            border-bottom: 10px solid #65B045;
            border-left: 9px solid rgba(0, 0, 0, 0);
            position: absolute;
            bottom: 0;
            left: -8px;
            content: "";
        }

        .bubbledRight{
            float: right;
            margin-left: auto;
            text-align: right;
            -webkit-border-radius: 8px 8px 0px 8px;
            -moz-border-radius: 8px 8px 0px 8px;
            -o-border-radius: 8px 8px 0px 8px;
            -ms-border-radius: 8px 8px 0px 8px;
            border-radius: 8px 8px 0px 8px;
            background-color: #07D;
            color: white;
        }

        .bubbledRight:before {
            border-bottom: 9px solid #07D;
            border-right: 9px solid rgba(0, 0, 0, 0);
            position: absolute;
            bottom: 0;
            right: -8px;
            content: "";
        }

    </style>
</head>
<body>
    <div id="chat"></div>

    <form id="send-message">
        <input id="message" type="text" />
        <button type="submit">Send</button>
    </form>
</body>
<script src="//code.jquery.com/jquery-latest.min.js"></script>
<script src="/socket.io/socket.io.js"></script>

<script>
    jQuery(function($) {
        var socket = io.connect();
        var sendmessage = $('#send-message');
        var sendmessagetext = $('#message');
        var chat = $('#chat');

        sendmessage.submit(function(e) {
            e.preventDefault();
            socket.emit('send message', sendmessagetext.val());
            chat.append('<div class="bubbledRight">' + sendmessagetext.val() + '</div>');
            sendmessagetext.val('');
        })

        socket.on('connect', function() {
            //socket.emit('set room', this.socket.sessionid);
        })

        socket.on('new message', function(data) {
            chat.append('<div class="bubbledLeft">' + data + '</div>');
            chat.scrollTop(chat[0].scrollHeight)
//          console.log(data);
        });

    });

</script>

</html>
settings.json

{
    "port":"3000",
    "hosts":[
            "127.0.0.1",
            "example.com"
        ],
    "secret":"faskjhfuwjhfjas"
}

当尝试在socket中的任何位置读取会话时,我会得到“未定义”。

您将使用express session和socket.io的新实现,它将两者完美地结合在一起

Package.JSON

添加依赖项

"socket.io" : "*",
"express-session" : "*",
"express-socket.io-session" : "*"
App.js

为会话数据添加额外的编码

var server  = require("http").createServer(app),
    io = require("socket.io")(server),
    session = require("express-session")({
    secret: "my-secret",
    resave: true,
    saveUninitialized: true
  }),
  sharedsession = require("express-socket.io-session");


// Attach session
app.use(session);

// Share session with io sockets

io.use(sharedsession(session));

io.on("connection", function(socket) {
    // Accept a login event with user's data
        console.log(session.id);
    socket.on("login", function(userdata) {
        socket.handshake.session.userdata = userdata;
    });
    socket.on("logout", function(userdata) {
        if (socket.handshake.session.userdata) {
            delete socket.handshake.session.userdata;
        }
    });        
});

“在浏览器存储成熟到大多数用户都拥有该功能之前,暂时不要使用浏览器存储”例如Cookie?非常确定php使用Cookie存储其会话id并跨选项卡持久化…您链接到的博客:,准确地显示了如何为浏览器提供可用于所有选项卡的会话id。不,它不在浏览器中存储数据。它将数据存储在RAM中(稍后将向您展示如何在Redis和MongoDB中存储该数据)并自动将会话id与该数据关联。如果愿意,您可以查看会话id,但该博客文章没有说明这一点。@slebetman--有点需要会话id。不必关心将零碎/零碎存储到浏览器会话中。您应该使用。很抱歉,响应延迟。尝试使用此功能,但不确定原因,但似乎当我只需要会话id时,它就太复杂了--socket.io也不能很好地使用它。这个git示例有帮助吗?我添加了我为此编写的源代码,这样你就可以看到我正在尝试做什么,以及哪里更容易失败。如果它只是编写一个会话/cookie变量,那么它就没有得到该死的唯一会话那么重要了id。甚至尝试存储它…epic到处都失败。无法获取id,这在php中是微不足道的。感谢对链接的反馈。检查。我注意到上面的GIT链接是针对旧版本的。我假设他们实现了对更高版本的承诺。我正在玩你的程序,看看是否可以实现它。这个NPM ppackage可能会有帮助,并提供您需要的更简单。我将很快制作一个示例,同时在看到link.npmjs.com/package/express-socket.io-session后让我知道您的进度。我们能够将该代码混合到我的服务器中,并且工作得很好。谢谢。
var server  = require("http").createServer(app),
    io = require("socket.io")(server),
    session = require("express-session")({
    secret: "my-secret",
    resave: true,
    saveUninitialized: true
  }),
  sharedsession = require("express-socket.io-session");


// Attach session
app.use(session);

// Share session with io sockets

io.use(sharedsession(session));

io.on("connection", function(socket) {
    // Accept a login event with user's data
        console.log(session.id);
    socket.on("login", function(userdata) {
        socket.handshake.session.userdata = userdata;
    });
    socket.on("logout", function(userdata) {
        if (socket.handshake.session.userdata) {
            delete socket.handshake.session.userdata;
        }
    });        
});