套接字子类不发送事件

时间:2015-03-06 02:56:11

标签: javascript node.js sockets events coffeescript

短版:TCP套接字子类未保留事件监听器。

我有一个TCP自定义套接字(CoffeeScript):

jsonstream = require 'json-stream'
NetSocket = require('net').Socket
util = require 'util'

Socket = ->
  NetSocket.call(this);
  @actions = {}
  @setEncoding('utf8')
  @stream = jsonstream()
  @stream.on 'data', (data)=>
    console.log 'WTF WE GOT DATA', data
    @response(data)
  @pipe(@stream)
  return this

util.inherits(Socket, NetSocket);

Socket.prototype.response = (json)->
  console.log 'WTF IS THIS JSON', json
  id = json.id
  deferred = @actions[id]
  delete json.id
  return deferred.resolve(json) if deferred
  console.log 'wat', @listeners('task')
  console.log 'errors', @listeners('error')
  console.log 'errors', @listeners('data')
  res = @emit('task', json.execute)
  console.log res

界面相当简单。我发送数据,当我收到数据时,我希望它是JSON。我正在将此套接字流式传输到json-stream,它为我处理JSON的反序列化。效果很好。

问题是:由于某种原因,我的套接字没有保留它的事件监听器

测试用例(套接字已初始化为s并在before块中连接):

it 'should get a task to execute', (done)->
  @timeout(22000)

  console.log 'WTF', s.listeners('task')

  s.on 'task', (task)->
    console.log 'GOT TASK', task
    task.name.should.equal name
    done()

  s.on 'data', (data)->
    console.log 'DATA TEST', data

  s.on 'error', (err)->
    console.log 'ERROR', err

  console.log 'after'
  console.log 'TESTING', s.listeners('task')[0].toString()

测试结果:

WTF []
before
SOMETHING ADDED task function (task) {
          console.log('GOT TASK', task);
          task.name.should.equal(name);
          return done();
        }
SOMETHING ADDED data function (data) {
          return console.log('DATA TEST', data);
        }
SOMETHING ADDED error function (err) {
          return console.log('ERROR', err);
        }
after
TESTING function (task) {
          console.log('GOT TASK', task);
          task.name.should.equal(name);
          return done();
        }
WTF WE GOT DATA { execute: 
   { __v: 0,
     name: 'd699ecbf-eda8-4588-a96f-b58e8a1c9a2e',
     time: '2015-03-06T02:25:40.577Z',
     _id: '54f91010bf41ed23cfe19339',
     created_at: '2015-03-06T02:25:20.579Z',
     updated_at: '2015-03-06T02:25:20.579Z',
     opts: { some: 'data' } } }
WTF IS THIS JSON { execute: 
   { __v: 0,
     name: 'd699ecbf-eda8-4588-a96f-b58e8a1c9a2e',
     time: '2015-03-06T02:25:40.577Z',
     _id: '54f91010bf41ed23cfe19339',
     created_at: '2015-03-06T02:25:20.579Z',
     updated_at: '2015-03-06T02:25:20.579Z',
     opts: { some: 'data' } } }
wat []
errors []
errors [ [Function: ondata] ]
false

从日志中添加了task的事件处理程序。经过一段时间后,从套接字接收数据( WTF WE GOT DATA ),流将其解析为JSON,但当它调用@emit时,没有收听者收到事件。事实上,在那时,查看task的听众表明没有听众。

我的听众去哪儿了?

您可以在GitHub

上查看所有这些代码

1 个答案:

答案 0 :(得分:0)

我决定将学术方法留给更感兴趣的人,并放弃自定义套接字方法。我在服务器和客户端上切换到Socket.io。

constructor: (@opts = {})->
@opts.port ?= DEFAULT_PORT
@opts.baseURL ?= "http://localhost:#{@opts.port}"
@socket = SocketIO("http://localhost:#{@opts.port}")

是生成的代码。用户引用client.socket并听取相关事件。效果很好。