2015-11-28 13 views
1

我使用的是快遞的頂部socket.io /節點快遞,保持變量對每個用戶

現在,我用這個方法:

// get room name from URL 
var requestRoom; 
app.get('/editor/:room', function(req, res) { 
    requestRoom = req.params.room; 
    res.render('editor/editor', { 
    title: 'Editor' 
    }); 
}); 

// use that room name for private rooms within socket.io 
io.on('connection', function(socket) { 
    socket.join(requestRoom); 
    // rest of socket.io code.... 

從URL抓取room-name看起來像sitename.io/editor/[room-name]

然後,我使用requestRoom作爲socket.to(requestRoom).broadcast..的變量,用於將套接字數據包發送到指定的房間。


問題

每當一個新的用戶訪問應用程序,requestRoom得到重新填充爲所有用戶,而不是隻爲剛加入的用戶。

是否有辦法爲每個「會話」啓動一個帶有自己變量的新「實例」? 我在這裏錯過了什麼?

+0

不能完全幫助你解決問題,但是這裏提供了一個有用的Node初學者提醒:節點是單處理的,所以你的服務器代碼只能在一個實例中執行,並且所有用戶在技術上將由該實例提供服務。而不是爲每個新用戶創建變量或類,嘗試將這種信息存儲在JSON對象中,如'var Users = {'room1':[23,57,122]'room2':[5,28]} '。對不起,我沒有回答你的問題,但我知道這是我在開始時就有麻煩想法,理解它最終幫助了很多。 –

+0

即時通訊範圍內的每個套接字連接變量,而不是它的工作原理就好 - 單實例部分是什麼讓我感到困惑,所以謝謝 –

回答

2

您無法爲每個會話創建新實例。

但是,您可以通過從客戶端發送房間名稱來解決此問題。 使用socket.io-client連接到WebSocket時,請將房間名稱添加到查詢參數中。

客戶:

var requestRoom = "roomName"; 
io('/', {query: "requestRoom=" + requestRoom}) 

服務器:

io.on('connection', function(socket) { 
    var requestRoom = socket.request._query.requestRoom; 
    socket.join(requestRoom); 
    // rest of socket.io code.... 

編輯:

尼古拉斯Kyriakides用簡單的方法來解決這個問題。

服務器:

io.on('connection', function(socket) { 
    var refererSplit = socket.request.headers.referer.split('/'); 
    var requestRoom = refAr[refererSplit.length-1]; //Considering Room name is at the end of the path. 
    socket.join(requestRoom); 
    // rest of socket.io code.... 

無需從客戶端傳遞ROOMNAME。

+0

實際上沒有,我仍然可以使用服務器的名稱,並只在套接字連接範圍內的每個變量 - 但是,無論如何感謝 –

+0

你的意思是你把'''io.on('連接',函數(套接字){'''在路由器本身內部? –

+0

不,我把網址嗅探在'io.on ('connection'....'我在那裏使用'socket.request.headers.referer'獲取URL,然後使用'url.parse'解析它,然後將它分割在'/'上,並將第三部分它是房間名稱 –