[英]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打開頁面,設置了“全局”變量username
和room
(現在將它們都設置為foo
),但是用戶1的運行速度很慢Internet,因此加載和連接socket.io需要一些時間。
現在,用戶2打開頁面,在用戶1打開socket.io連接之前,“全局”變量username
和room
更改為新值(讓我們使用bar
)。
現在,用戶1和用戶2連接到socket.io,但是由於用戶2的互聯網連接速度比用戶1快,因此即使用戶1具有username
和roomname
foo
, var username
和var 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',);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.