ios - Nodejs - 如何使用 socket.io 获取 url 参数?

标签 ios node.js sockets

我一直在研究 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 打开页面,“全局”变量 usernameroom 被设置(现在让我们将它们都设置为 foo),但是用户 1网速较慢,因此加载和连接 socket.io 需要一些时间。

现在用户 2 打开页面,“全局”变量 usernameroom 被更改为新值(让我们使用 bar) , 在用户 1 打开 socket.io 连接之前。

现在用户 1 和用户 2 连接到 socket.io,但是由于用户 2 的互联网速度比用户 1 快,var usernamevar roomname 现在都设置为值 bar 即使用户 1 有 usernameroomname foo

提醒一下。

关于ios - Nodejs - 如何使用 socket.io 获取 url 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41580355/

相关文章:

ios - 视频 URL pathExtension find nil

ios - 以 HH :mm am/pm of a HIChart's Line chart using Swift 5. 0 格式设置 tickInterval

node.js - SailsJS - Nodejs Https 请求。发送后无法设置 header

javascript - NodeJS、Javascript 聊天;对于每个数组

c - 如何解决这个IP地址错误?

java - 无法从 AsyncTask 和无限循环更新 EditText

iphone - iOS交叉编译!需要什么?

ios - 如何在 swift UI 测试中根据标签值查找标签中的静态文本?

javascript - Socket.io 服务器端广播

c++ - bind() 可以将 IPTABLES 中配置的端口作为转发端口