2012-07-05 38 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

相关问题