簡體   English   中英

Node.js-如何使用socket.io獲取url參數?

[英]Nodejs - how to get url parameters using socket.io?

我一直在研究Node.js和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 ,但我認為這是一個黑客,應該有更好的方式來實現這一目標?

解決這種情況的好方法是什么?

套接字可以發出任何事件,因為套接字對象是EventEmitter以便它可以隨時觸發(發出)事件,並且在另一端,服務器可以通過.on函數監聽此事件。

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

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

由於您使用的是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的運行速度很慢Internet,因此加載和連接socket.io需要一些時間。

現在,用戶2打開頁面,在用戶1打開socket.io連接之前,“全局”變量usernameroom更改為新值(讓我們使用bar )。

現在,用戶1和用戶2連接到socket.io,但是由於用戶2的互聯網連接速度比用戶1快,因此即使用戶1具有usernameroomname foovar usernamevar roomname現在也都設置為value bar

只是抬頭。

我有同樣的問題,並得出了不同的解決方案,在連接時我在其中傳遞參數。

//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

因此,在服務器端,我們可以像下面這樣獲取參數

let userUUID = socket.handshake.query.user;
let roomId = socket.handshake.query.room;

好處是,當連接丟失時,您不必依賴客戶端將再次調用自定義連接事件的事實,您可以將邏輯放入默認的io.on('connection',);

更多信息在這里https://socket.io/docs/server-api/#socket-handshake

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM