短版: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
上查看所有这些代码答案 0 :(得分:0)
我决定将学术方法留给更感兴趣的人,并放弃自定义套接字方法。我在服务器和客户端上切换到Socket.io。
constructor: (@opts = {})->
@opts.port ?= DEFAULT_PORT
@opts.baseURL ?= "http://localhost:#{@opts.port}"
@socket = SocketIO("http://localhost:#{@opts.port}")
是生成的代码。用户引用client.socket
并听取相关事件。效果很好。