2012-04-03 114 views
3

我使用socket.io與node.js和我的路線之一,我有連接事件處理程序。Socket.io連接堆積在每個刷新

  app.io.on('connection', function(socket) { 
        console.log('connect'); 

        socket.on('disconnect', function(){ 
         console.log('disconnect'); 
         res.end(); 
        }); 
      }); 

我每次刷新的呼喚這條路線的頁面,似乎不斷增加了,例如,如果我刷新5次,我將最終有5「連接」的消息,在單次刷新,在日誌中。

有沒有一種很好的方法來限制它,所以它不這樣做?

謝謝!

編輯:

當我刷新多次,我得到這個錯誤:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit

我可以增加限制,但我有一種感覺,沒有正確的解決方案。

回答

4

你必須將你的代碼放在你的請求處理程序之外(在每個請求中調用它)。 該代碼應該處理所有客戶端的傳入連接(不是針對每個請求)。 在你的例子中,它爲每個請求創建一個新的事件監聽器,你只需要一個!

+0

好吧,我已經這樣做了,它可以工作,但我需要將數據從我的路由代碼傳遞到套接字連接處理程序,如果我的連接處理程序首先定義在路徑之外,那麼我將如何傳遞對象從我的路線,回到我的連接處理程序? – dzm 2012-04-03 22:26:35

+0

您可以使用數組來存儲來自http-request的對象,並在連接處理程序中讀取它們。但是我假設你想用一個http-request發送一些數據給連接的客戶端,在這種情況下,你只需要使用'app.io.emit('myEvent',{msg:'hello world'});'在請求處理程序中。 – stewe 2012-04-03 22:50:03

+0

完美,是的,這應該沒問題。非常感謝 – dzm 2012-04-03 22:55:33