Express,为每个用户保留变量
Express, keep variables for each user
我在 Express/Node
之上使用 socket.io
现在我正在使用这个方法:
// get room name from URL
var requestRoom;
app.get('/editor/:room', function(req, res) {
requestRoom = req.params.room;
res.render('editor/editor', {
title: 'Editor'
});
});
// use that room name for private rooms within socket.io
io.on('connection', function(socket) {
socket.join(requestRoom);
// rest of socket.io code....
从看起来像 sitename.io/editor/[room-name]
的 URL 中获取 room-name
。
然后我使用 requestRoom
作为 socket.to(requestRoom).broadcast..
的变量,用于将套接字数据包发送到特定房间。
问题
每次新用户访问该应用程序时,requestRoom
都会为所有用户重新填充,而不仅仅是为刚刚加入的用户。
有没有办法用每个 'session' 的变量来启动一个新的 'instance'?
我在这里错过了什么?
您不能为每个会话创建新实例。
但是,您可以通过客户端发送房间名称来解决此问题。
当您使用 socket.io-client 连接到 WebSocket 时,将房间名称添加到查询参数中。
客户:
var requestRoom = "roomName";
io('/', {query: "requestRoom=" + requestRoom})
服务器:
io.on('connection', function(socket) {
var requestRoom = socket.request._query.requestRoom;
socket.join(requestRoom);
// rest of socket.io code....
编辑:
Nicholas Kyriakides 使用更简单的方法解决了这个问题。
服务器:
io.on('connection', function(socket) {
var refererSplit = socket.request.headers.referer.split('/');
var requestRoom = refAr[refererSplit.length-1]; //Considering Room name is at the end of the path.
socket.join(requestRoom);
// rest of socket.io code....
无需从客户端传递 roomName。
我在 Express/Node
之上使用 socket.io现在我正在使用这个方法:
// get room name from URL
var requestRoom;
app.get('/editor/:room', function(req, res) {
requestRoom = req.params.room;
res.render('editor/editor', {
title: 'Editor'
});
});
// use that room name for private rooms within socket.io
io.on('connection', function(socket) {
socket.join(requestRoom);
// rest of socket.io code....
从看起来像 sitename.io/editor/[room-name]
的 URL 中获取 room-name
。
然后我使用 requestRoom
作为 socket.to(requestRoom).broadcast..
的变量,用于将套接字数据包发送到特定房间。
问题
每次新用户访问该应用程序时,requestRoom
都会为所有用户重新填充,而不仅仅是为刚刚加入的用户。
有没有办法用每个 'session' 的变量来启动一个新的 'instance'? 我在这里错过了什么?
您不能为每个会话创建新实例。
但是,您可以通过客户端发送房间名称来解决此问题。 当您使用 socket.io-client 连接到 WebSocket 时,将房间名称添加到查询参数中。
客户:
var requestRoom = "roomName";
io('/', {query: "requestRoom=" + requestRoom})
服务器:
io.on('connection', function(socket) {
var requestRoom = socket.request._query.requestRoom;
socket.join(requestRoom);
// rest of socket.io code....
编辑:
Nicholas Kyriakides 使用更简单的方法解决了这个问题。
服务器:
io.on('connection', function(socket) {
var refererSplit = socket.request.headers.referer.split('/');
var requestRoom = refAr[refererSplit.length-1]; //Considering Room name is at the end of the path.
socket.join(requestRoom);
// rest of socket.io code....
无需从客户端传递 roomName。