我一直在研究 Nodejs 和 Socket.io,问题是我正在努力寻找 url 参数 (www.example.com/sample/:sampleid) 并在我的套接字连接上使用它。
这是一个例子:
var roomname;
var username;
app.get('/room/:roomname/user/:username', function(req, res){
var room = {
username: req.params.username,
roomname: req.params.roomname
};
roomname = room.roomname;
username = room.username;
res.render('room', room);
});
var users = {};
io.sockets.on('connection', function (socket) {
socket.username = username;
socket.room = roomname;
users[username] = username;
console.log("joining room: " + roomname)
socket.join(roomname);
console.log("emiting to room: " + roomname)
socket.broadcast.to(roomname).emit('newUser', username);
});
我只是将名称存储在 roomname 上并在 io.sockets.on
中使用它,但我认为这是一个 hack,应该是实现此目标的更好方法...
解决这种情况的好方法是什么?
最佳答案
由于您正在使用 res.render
并且您已经将 room
作为数据参数传递,我认为最好利用它并执行类似这个(我在示例中使用 EJS,因为我已经习惯了):
客户:
<script>socket.emit('join', {room: '<%- room.roomname %>' });</script>
服务器:
io.on('connection', (socket) => {
socket.room = '';
socket.on('join', (msg) => {
socket.room = msg.room;
});
});
否则,发出 document.location.pathname
可能是个好主意,但是您必须自己解析路径才能从中获取房间名称。
编辑:
你现在做的事情其实是很危险的,因为有以下场景:
用户 1 打开页面,“全局”变量 username
和 room
被设置(现在让我们将它们都设置为 foo
),但是用户 1网速较慢,因此加载和连接 socket.io 需要一些时间。
现在用户 2 打开页面,“全局”变量 username
和 room
被更改为新值(让我们使用 bar
) , 在用户 1 打开 socket.io 连接之前。
现在用户 1 和用户 2 连接到 socket.io,但是由于用户 2 的互联网速度比用户 1 快,var username
和 var roomname
现在都设置为值 bar
即使用户 1 有 username
和 roomname
foo
。
提醒一下。
关于ios - Nodejs - 如何使用 socket.io 获取 url 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580355/