3

Socket.IO と Express で Node.JS を使用しています。私の目標は、アプリケーションが必要とするすべての機能を搭載したカスタム Socket.IO+Express サーバーを作成するモジュールを作成することです。たとえば、任意の時点で接続されているクライアントの数を追跡します。

問題は、可能であれば、サーバーをクラスとして機能させたいということです。他の 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(); };

Socket.IO のコールバックのキーワードは、オブジェクトではなく、イベントをトリガーしたクライアントオブジェクトを参照するため、コールバック内のコード"connection"は正しくありません。コールバック内からプロパティにアクセスする方法はありますか?this"connection"MyServerclientCount

4

1 に答える 1

3

の a 変数にコピーthisして適切なクロージャーを作成し(ほとんどの人はそれを呼び出すのが好きですが、一部の人は を好みます)、それを接続ハンドラーで使用します。selfthat

var self=this;
this.ioServer.sockets.on(
    "connection",
    function()
    {
        self.clientCount++;
        console.log(self.clientCount + " clients connected.");
    }
);
于 2012-07-06T01:51:42.517 に答える