2

次のコードがあります

function Server() {

    function eventHandler(data) {
        console.log('DATA ' + this.server.socket.remoteAddress + ': ' + data);
        socket.write('You said "' + data + '"');
    }

    function connectionHandler(socket) {
        console.log('server connected');
        console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
        socket.on('data', eventHandler);
    }

    this.server = net.createServer(connectionHandler);

    this.port = undefined;

    this.startServer = function(port) { //Maybe change backlog for security reasons
        this.port = port;
        this.server.listen(port, function() { //'listening' listener add handle object here
            console.log('server bound');});
    }
}

接続が確立されるたびに取得します

server bound
server connected
CONNECTED: 132.65.16.64:55028

/a/fr-05/vol/netforce/stud/yotamoo/ex4/myHTTP.js:7
        console.log('DATA ' + this.server.socket.remoteAddress + ': ' + data);
                                          ^
TypeError: Cannot read property 'remoteAddress' of undefined
    at Socket.eventHandler (/a/fr-05/vol/netforce/stud/yotamoo/ex4/myHTTP.js:7:43)
    at Socket.emit (events.js:67:17)
    at TCP.onread (net.js:329:14)

これはevenHandler()もちろん関係があります。Node JS でのオブジェクトの作成方法とそのスコープがわかりません。たとえば、どこsocketで作成されましたか?data彼らの範囲は何ですか?

どうもありがとう

4

2 に答える 2

0

これは、現在の呼び出し関数を意味します。

あなたの場合、これは eventHandler を指し、eventHandler はアクセス可能な値としてデータのみを持っています。

ソケットにアクセスしようとすると、同様に例外が発生します。ソケットはその関数スコープにないためです。

ソケットとデータの両方が、node.js のメイン パターンである非同期コールバックから取得されます。

于 2012-12-06T15:56:55.247 に答える
0

イベント ハンドラー関数で使用する値は次のようになりbindます。this

function Server() {

    function eventHandler(data) {
        console.log('DATA ' + this.server.socket.remoteAddress + ': ' + data);
        socket.write('You said "' + data + '"');
    }

    function connectionHandler(socket) {
        console.log('server connected');
        console.log('CONNECTED: ' + socket.remoteAddress +':'+ socket.remotePort);
        socket.on('data', eventHandler.bind(this));
    }

    this.server = net.createServer(connectionHandler.bind(this));

    this.port = undefined;

    this.startServer = function(port) {
        this.port = port;
        this.server.listen(port, function() {
            console.log('server bound');});
    };
}
于 2012-12-06T18:34:52.303 に答える