2012-07-05 41 views
3

我使用Node.JS與Socket.IO和Express。我的目標是創建一個模塊來創建自定義的Socket.IO + Express服務器,並加載我的應用程序所需的所有功能。例如,跟蹤在任何給定時間連接的客戶端數量。在Node.JS的類中使用Socket.IO回調的正確方法是什麼?

問題是,如果可能的話,我希望服務器可以像班級一樣工作。我已經看到其他Node.JS模塊使用類很好(包括Socket.IO本身),所以我認爲它不應該與Node的面向模塊的體系結構衝突。我需要它來處理類的原因是我希望能夠輕鬆創建多個服務器實例。

這裏是我所(簡化爲簡潔起見):

index.js

var myserver = require("./myserver"); 
var myserver1 = myserver.createServer(); 
var myserver2 = myserver.createServer(); 

myserver1.port = 8080; 
myserver2.port = 8081; 

myserver1.start(); 
myserver2.start(); 

myserver.js

var io = require("socket.io"); 
var express = require("express"); 
var path = require("path"); 

function MyServer() 
{ 
    this.port = 8080; 
    this.expressServer = null; 
    this.ioServer = null; 

    this.clientCount = 0; 
} 

Server.prototype.getClientCount = function() 
{ 
    return this.clientCount; 
} 

Server.prototype.start = function() 
{ 
    this.expressServer = express.createServer(); 
    this.ioServer  = io.listen(this.expressServer); 
    this.expressServer.listen(this.port); 

    this.ioServer.sockets.on(
     "connection", 
     function() 
     { 
      this.clientCount++; 
      console.log(this.clientCount + " clients connected."); 
     } 
    ); 
} 

exports.createServer = function() { return new MyServer(); }; 

"connection"回調中的代碼是不正確,因爲Socket.IO中的this關鍵字回調是指客戶端觸發了"connection"事件的對象,而不是MyServer對象。那麼有沒有辦法從回調中訪問clientCount屬性?

回答

3

複製this另一變量創建正確關閉(大多數人喜歡叫它self但有些人更喜歡that),並且在連接處理器使用它:

var self=this; 
this.ioServer.sockets.on(
    "connection", 
    function() 
    { 
     self.clientCount++; 
     console.log(self.clientCount + " clients connected."); 
    } 
); 
+0

它的工作原理!我以前曾嘗試爲此創建一個'self'變量,但我只是在構造函數中創建了它。我沒有意識到它也必須在'start'方法中創建。 – jSepia 2012-07-06 17:52:17

相關問題