套接字子类不发射事件
Socket Subclass Not Emitting Event
简短版本: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
上查看所有代码
我决定将学术方法留给更感兴趣的人,并放弃自定义套接字方法。我在服务器和客户端上都切换到了 Socket.io。
constructor: (@opts = {})->
@opts.port ?= DEFAULT_PORT
@opts.baseURL ?= "http://localhost:#{@opts.port}"
@socket = SocketIO("http://localhost:#{@opts.port}")
是结果代码。用户引用 client.socket
并监听其上的事件。效果很好。
简短版本: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
上查看所有代码我决定将学术方法留给更感兴趣的人,并放弃自定义套接字方法。我在服务器和客户端上都切换到了 Socket.io。
constructor: (@opts = {})->
@opts.port ?= DEFAULT_PORT
@opts.baseURL ?= "http://localhost:#{@opts.port}"
@socket = SocketIO("http://localhost:#{@opts.port}")
是结果代码。用户引用 client.socket
并监听其上的事件。效果很好。