Javascript nodejs的新成员。什么是PHP';在nodejs中的会话_start()?
我想生成一个会话id,但它对浏览器是唯一的,而不是每个选项卡 我能找到的就是这种类型的东西>> 它演示了如何使用会话存储数据,但在每个选项卡中都有限制,最后会出现一个新会话。我想要的是,浏览器获得一个唯一的会话id,该id自动生成并可从其他选项卡访问。在浏览器存储成熟到大多数用户都拥有该功能之前,暂时不要使用浏览器存储。因为我们仍然有相当多的用户使用不支持本地存储的旧浏览器,所以随机会话id是理想的 我使用这个唯一的id作为私人“聊天室”,聊天程序的用户将加入该“聊天室”以获得支持。每个用户都将在自己的私人房间中,但可以通过选项卡访问同一个房间。我知道这有点草率,但从nodejs的初学者的角度来看,使用浏览器实例的某个唯一键要比处理跨选项卡套接字打开/关闭检测等简单得多。我意识到,使用这种方法,每个选项卡都有自己的到服务器的套接字连接,我现在还可以 我尝试了以下方法(在我看来,它将使用套接字会话,而不是浏览器会话,即使它确实工作),但不工作(对于有经验的人来说,这可能是不工作的原因) 客户Javascript nodejs的新成员。什么是PHP';在nodejs中的会话_start()?,javascript,node.js,sockets,session,Javascript,Node.js,Sockets,Session,我想生成一个会话id,但它对浏览器是唯一的,而不是每个选项卡 我能找到的就是这种类型的东西>> 它演示了如何使用会话存储数据,但在每个选项卡中都有限制,最后会出现一个新会话。我想要的是,浏览器获得一个唯一的会话id,该id自动生成并可从其他选项卡访问。在浏览器存储成熟到大多数用户都拥有该功能之前,暂时不要使用浏览器存储。因为我们仍然有相当多的用户使用不支持本地存储的旧浏览器,所以随机会话id是理想的 我使用这个唯一的id作为私人“聊天室”,聊天程序的用户将加入该“聊天室”以获得支持。每个用户都
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;
}
});
});