【发布时间】:2014-07-28 18:09:20
【问题描述】:
在我的socket.io 应用程序(1.0.6 版)中,我有许多遵循相同架构的事件:
客户端发出带有数据的'some client emit',服务器接收'some client emit',将一些对象保存在mongoose中,并将带有解析数据的'some server emit'发送给其他客户端,并将带有特定数据的单独的'some server emit'发送给发送客户端。
例如,如果客户端代码包括:
...
console.log('emitting some client emit');
this.socket.emit('some client emit', {prop1: 'val1', prop2: 'val2'});
...
this.socket.on('some server emit', function(data){
console.log('some server emit', data);
if(data.doSomething){
...
}
...
}
this.socket.on('error', function(err){
console.log('error', err);
}
...
那么服务器代码包括:
...
io.on('connection', function(socket){
console.log(socket.id, 'connected');
... deal with connect
socket.on('disconnect', function(){
console.log('socket', socket.id, 'disconnected');
... deal with disconnect
}
socket.on('some client emit', function(data){
console.log('some client emit', data);
var newThing = new Thing({
prop1: data.prop1,
prop2: data.prop2
});
newThing.save(function(err){ // a mongoose object
if(err){
console.log('error saving thing', err);
socket.emit('error', err);
} else {
console.log('saving successful');
socket.emit('some server emit', {thing: newThing, doSomething: true});
for (var i = 0; i < someListOfSocketIds.length; i++)
socket.broadcast.to(someListOfSocketIds[i]).emit('some server emit', {thing: newThing, doSomething: false});
}
}
console.log('end of some client emit');
}
}
我遇到的问题是客户端发出'some client emit',服务器获取事件并将'some server emit' 发送到套接字ID 列表和发送客户端。所有客户端都会收到发射,但原始发送客户端收到保存错误并断开连接并重新连接。
所以发送客户端的控制台是这样的:
- emitting some client emit
- some server emit {prop1: 'val1', prop2: 'val2', _id: <some guid>}
- error {type: "TransportError", description: TypeError, stack: "Error: parser decode error
at WS.Transport.onError (http://cdn.socket.io/socket.io-1.0.6.js:1:28005)
at WS.Transport.onData (http://cdn.socket.io/socket.io-1.0.6.js:1:28768)",
message: "parser decode error", ...}
而服务器的控制台是:
- *client-socket-id* connected
- some client emit {prop1: 'val1', prop2: 'val2'}
- saving successful
- end of some client emit
- socket *client-socket-id* disconnected
- *client-socket-id* connected
需要注意的是,newThing 确实进入了数据库,其他客户端确实得到了它们的发射,并且服务器代码"console.log('error saving thing', err);" 没有运行。这让我很困惑。
【问题讨论】:
-
澄清并可能帮助其他可能像我一样遇到此问题的人:如果出现运行时错误,客户端的套接字会自动断开连接。 很难找到任何记录这一点的东西。
-
我意识到这非常模糊,但我似乎无法再缩小范围。导致断开/重新连接行为的错误类型的一个示例是简单地尝试访问空字段或几乎任何仅在客户端上使用断点才能找到的基本运行时错误。我也搜索了任何类型的文档,但找不到任何东西。在我修复了我的几个错误之后,代码运行良好,每次我看到相同的功能都是因为客户端上出现了类似的运行时错误。
标签: javascript express socket.io mongoose