【发布时间】:2021-08-04 02:27:06
【问题描述】:
一个客户端连接到我的服务器并使用 Socket.io 发出事件,发送回数据。我只能捕捉某些事件。
此服务器端代码按预期工作:
io // an instance of SocketServer
.on('connection', socket => {
console.log(`Socket.io connection from ${socket.client.conn.remoteAddress}`)
socket
.on('start recording', ({ id }) => { // event emitted by the client
recordings[id] = socket
console.log({type: 'start', id})
})
.on('stop recording', ({ id }) => { // event emitted by the client
recordings[id] = undefined
console.log({type: 'stop', id})
})
})
但是,在我的端点处理程序中,我无法侦听更多事件(请注意,客户端几乎总是会加入中游,并且是与发送数据的客户端分开的客户端):
router.get('/play', (req, res, next) => {
try {
let id = req.query.id
console.debug({id, recordings})
if(!recordings[id]) {
res.status(409)
res.json({
message:
"This data source isn't currently sending data. Please check the ID or try again later.",
})
return
}
recordings[id] // this is the same socket that the code above is listening on
.on('audio'+id, data=>{ // this event is likewise emitted by the client,
// but the handler never fires
res.json({id, event:'audio', seq: data.seq})
console.log({type:'audio event', id, seq})
})
.on('close'+id, () => {
res.json({id, event:'close'})
console.log({type:'audio close', id, seq})
})
} catch (e) {
next(e)
}
})
当我使用环境变量 DEBUG=socket* 运行服务器时,我得到的输出证明 Socket.io 可以看到所有事件:
Socket.io connection from ::1
socket.io-parser decoded 2["start recording",{"id":"test_id"}] as {"type":2,"nsp":"/","data":["start recording",{"id":"test_id"}]} +18ms
socket.io:socket got packet {"type":2,"nsp":"/","data":["start recording",{"id":"test_id"}]} +20ms
socket.io:socket emitting event ["start recording",{"id":"test_id"}] +0ms
socket.io:socket dispatching an event ["start recording",{"id":"test_id"}] +0ms
{
type: 'start',
id: 'test_id',
recordings: {
// ...
}
socket.io-parser decoded 2["audiotest_id",{"seq":0}] as {"type":2,"nsp":"/","data":["audiotest_id",{"seq":0}]} +3s
socket.io:socket got packet {"type":2,"nsp":"/","data":["audiotest_id",{"seq":0}]} +3s
socket.io:socket emitting event ["audiotest_id",{"seq":0}] +0ms
socket.io:socket dispatching an event ["audiotest_id",{"seq":0}] +0ms
socket.io-parser decoded 2["audiotest_id",{"seq":1}] as {"type":2,"nsp":"/","data":
// ...
{"type":2,"nsp":"/","data":["stop recording",{"id":"test_id"}]} +1s
socket.io:socket got packet {"type":2,"nsp":"/","data":["stop recording",{"id":"test_id"}]} +1s
socket.io:socket emitting event ["stop recording",{"id":"test_id"}] +0ms
socket.io:socket dispatching an event ["stop recording",{"id":"test_id"}] +0ms
{ type: 'stop', id: 'test_id', recordings: { test_id: undefined } }
socket.io-parser decoded 2["closetest_id"] as {"type":2,"nsp":"/","data":["closetest_id"]} +4ms
socket.io:socket got packet {"type":2,"nsp":"/","data":["closetest_id"]} +4ms
socket.io:socket emitting event ["closetest_id"] +0ms
socket.io:socket dispatching an event ["closetest_id"] +0ms
socket.io-parser decoded 1 as {"type":1,"nsp":"/"} +1ms
socket.io:socket got packet {"type":1,"nsp":"/"} +2ms
socket.io:socket got disconnect packet +0ms
socket.io:socket closing socket - reason client namespace disconnect +0ms
socket.io:client client close with reason transport close +10s
我做错了什么?
【问题讨论】: