0

特定のイベントをリッスンして処理することになっているコードがいくつかありますが、イベントが実際に発行されることはないか、リスナーがイベントをキャッチすることはありません。

ここには、リッスンするサーバーと処理するアプリの2つのモジュールがあります(アプリがメインモジュールです)。

server.js:

var events = require('events'),
    util   = require('util'),
    dgram  = require('dgram');

var Server = function() {
    this.self = this;
    events.EventEmitter.call(this);

    this.socket = dgram.createSocket('udp4');
    this.init = function(port) {
        this.socket.bind(port);
        console.log('Listening on port ' + port);
    }

    this.socket.on('message', function(buf, rinfo) {
        var rawInfo = buf.toString().split('&');
        var data = {};

        for (var i = 0; i < rawInfo.length; i++) {
            var key = rawInfo[i].split('=')[0];
            var val = rawInfo[i].split('=')[1];
            data[key] = val;
        }

        var type = data.type;

        console.log('emitting event type ' + type);
        this.emit(type, data);
    });
};

util.inherits(Server, events.EventEmitter);

// exports
module.exports = Server;

(これは作成できる唯一のオブジェクトです):

{   type: 'login',
    name: 'x3chaos',
    displayname: 'x3chaos',
    world: 'world' }

app.js:

var dgram  = require('dgram');
var Server = require('./server');

var server = new Server();
server.init(41234);

// FIXME
server.on('login', function(data) {
    console.log('received data');
    console.log(data);
});

ここでの問題は何ですか:イベントが発生していないのですか、それともリスナーがリッスンしていないのですか?
それは私が見逃しているものかもしれません。あなたは彼らが2つの頭について何を言っているか知っています...

TIA :)

4

1 に答える 1

1

this.emitは、コールバックを使用しているため機能しないと思います。これは、サーバーインスタンスではなく、コールバックコンテキストを参照します。その上で、this.self = thisの代わりに、var self = thisを実行してから、コールバック内でself.emit..を実行してください。

于 2013-03-08T23:42:13.793 に答える