2013-10-31 32 views
1

我有一個使用express和socket.io的nodeJS應用程序。我想泄露一些代碼,以便它只在我服務的一個頁面上運行。爲了做到這一點,我使用express來聽取請求並提供html頁面作爲響應。在nodeJS中使用express和socket.io時的重複值

app.get('/archive', function(request, response) { 
    response.sendfile(__dirname + "/views/table.html"); 
} 

我也有一個socket.io函數來偵聽併發送數據到html頁面。

io.sockets.on('connection', function(socket) { 
    channel.subscribe('cheat', function(message) { 
     socket.emit('message', message); 
});\ 

一切,當代碼是這樣的,但是當我試圖把socket.on功能app.get功能我有問題的內部運行偉大。第一個請求完美地工作,但是當頁面刷新時,所有數據都被複制。第一次是x2,然後是x3,然後是x4,依此類推。有誰知道爲什麼會發生這種情況?

這是我最後的代碼如下所示:

app.get('/archive', function(request, response) { 
    response.sendfile(__dirname + "/views/table.html"); 
    io.sockets.on('connection', function(socket) { 
     channel.subscribe('cheat', function(message) { 
     socket.emit('message', message); 
    }); 
} 

回答

0

我用url.parse函數來獲取頁面的名稱,像這樣:

var curURL = url.parse(request.url).pathname; 

然後我可以檢查當前的URL

if (curURL == '/') { 
    //code 
} 

至於有重複值的問題,我忘了在退出時取消訂閱。在subscription.unsubscribe();之後它一切正常。

1

你不應該把Socket.IO連接監聽器的HTTP路線內。每次有連接時都會調用Socket.IO對象的connection事件,因此如果每次調用HTTP路由時都創建一個新的連接偵聽器,那麼將會有重複的偵聽器,這些偵聽器在連接時都會觸發。

如果您不希望Socket.IO在某個頁面上,請不要在該頁面上包含客戶端腳本。否則,另一種方法是將客戶端路徑存儲在cookie中,並在授權期間訪問該cookie。然後你可以接受或拒絕客戶。

+0

當我使用socket.handshake.url我得到一個唯一的URL(/socket.io/1/?t=128438943)而不是/路徑 – vcazan

+0

對不起,這似乎是不正確的。我已經修改了答案。 – hexacyanide