2013-03-08 181 views
0

我有一些应该监听某些事件并处理它们的代码,但事件从来没有真正发出,或者监听器从来没有捕获它们。Node.js - 事件不会触发?

这里有两个模块:侦听的服务器和处理的应用程序(应用程序是主模块)。

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); 
}); 

有什么问题就在这里:这个事件是不是正在发射,还是听者没有听?
它可能也只是我失踪的东西。你知道他们说什么两个头......

TIA :)

回答

1

我认为this.emit不会工作,因为你在回调的时候,这不会是指服务器实例,但回调上下文。而不是this.self =这试图做var self = this,然后在回调里面做self.emit ...

+1

我认为this.emit不会工作,因为你在回调中,请参阅服务器实例,但涉及回调上下文。而不是this.self =这个尝试做var self = this,然后在回调里面做self.emit ... – eveiga 2013-03-09 00:05:18

+0

就是这样。 :)这只是范围。 – ChaoticWeg 2013-03-09 04:15:49

+0

如果你愿意,把它作为答案,我会upvote和接受。谢谢,@eveiga。 :) – ChaoticWeg 2013-03-09 04:16:21