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

时间:2017-01-10 23:35:30

标签: 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);

});

我只是将名称存储在房间名称并在io.sockets.on内使用,但我认为这是一个黑客攻击,应该是实现这一目标的更好方法......

解决这种情况的好方法是什么?

3 个答案:

答案 0 :(得分:1)

套接字可以发出任何事件,因为套接字对象是EventEmitter,因此它可以随时触发(发出)事件,而另一方服务器可以通过.on函数监听此事件

example 
socket.emit('join',{name:"ahmed"})

server
io.sockets.on('join',function(data){
    console.log(data.name)
})

答案 1 :(得分:1)

由于您正在使用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打开页面,在用户1打开套接字之前,“全局”变量usernameroom被更改为新值(让我们使用bar)。 io连接。

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

只是抬头。

答案 2 :(得分:0)

我有同样的问题,并得出了不同的解决方案,我在连接时传递了参数。

dataList::get

因此,在服务器端,我们可以像下面这样获取参数

dataList = new ArrayList<>(dataList)

好处是,当连接丢失时,您不必依赖客户端将再次调用自定义连接事件的事实,您可以将逻辑放入默认的//it's my connection in client side let socket = socketio(`http://localhost:4444?user=${uuid}&room=${room}`); // where UUID is my user ID and room id

此处更多信息https://socket.io/docs/server-api/#socket-handshake