Javascript Node.js使用socket.emit处理错误
我有一些node.js客户端代码如下:Javascript Node.js使用socket.emit处理错误,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我有一些node.js客户端代码如下: socket.emit('clickAccept', { myrecid: recid }); 服务器端node.js代码很好,一切正常 如果我关闭服务器以模拟服务器端停机,然后在客户端单击触发此socket.emit的按钮,则会发生以下情况: 真的没什么,我想它最终可能会超时 当我重新启动服务器时,点击会被发送到服务器,服务器会对其进行操作(我猜是TCP) 我希望发生的是那些socket.emit调用在短时间超时后终止,并且在服务器恢复时不发送,这
socket.emit('clickAccept', { myrecid: recid });
服务器端node.js代码很好,一切正常
如果我关闭服务器以模拟服务器端停机,然后在客户端单击触发此socket.emit的按钮,则会发生以下情况:
- 真的没什么,我想它最终可能会超时
- 当我重新启动服务器时,点击会被发送到服务器,服务器会对其进行操作(我猜是TCP)
socket.emit
调用在短时间超时后终止,并且在服务器恢复时不发送,这会导致各种混乱,因为如果他们单击3次,什么也不会发生,那么当/如果连接或服务器恢复时,他们会同时得到3种反应
此外,如果他们单击,但由于服务器关闭而超时,我希望向客户端用户显示一个错误,让他们知道基本上单击不起作用,然后重试
我知道如何在套接字关闭时执行操作并显示错误,但如果他们当时不尝试单击某个内容,我不想这样做。没有理由向用户发射错误,因为如果用户当时不需要做任何事情,套接字会短暂关闭
因此,要明确的是,我只想在他们点击按钮并且客户端和服务器之间的套接字关闭时显示一个错误。而且。。。如果他们得到一个错误,我想杀死这个发射,而不是保存它,然后在服务器几秒钟后返回时触发它和所有其他的点击
提前感谢,我希望这至少相当清楚。问题的根源在于socket.io试图缓冲当前无法发送到服务器的任何数据(因为与服务器的连接已断开),当服务器恢复并恢复连接时,它会发送该数据 您可以在此处查看有关其工作原理的技术详细信息: 您有几个实现选项:
Socket.prototype.emitWhenConnected = function(msg, data) {
if (this.connected) {
this.emit(msg, data);
return null;
} else {
return new Error("not connected");
}
}
然后,将代码从使用
.emit()
切换到使用.emitWhenConnected()
,并在使用时检查返回值。如果返回值为null
,则未检测到错误。如果返回值不为null,则表示存在错误。问题的根源在于socket.io试图缓冲当前无法发送到服务器的任何数据(因为与服务器的连接已断开),当服务器恢复并恢复连接时,它会发送该数据
您可以在此处查看有关其工作原理的技术详细信息:
您有几个实现选项:
Socket.prototype.emitWhenConnected = function(msg, data) {
if (this.connected) {
this.emit(msg, data);
return null;
} else {
return new Error("not connected");
}
}
然后,将代码从使用
.emit()
切换到使用.emitWhenConnected()
,并在使用时检查返回值。如果返回值为null
,则未检测到错误。如果返回值不为null,则表示出现错误。感谢其他答案和帮助。我最终以一种非常简单的方式解决了这个问题。见下文:
if(socket.connected){
//在这里做你的事
}否则{
//在这里抛出一个错误,告诉用户他们的互联网很可能已关闭
}
希望这能帮助到其他人,我们的代码有了很大的改进,以确保用户在网络/互联网中断时得到正确的反馈。感谢其他答案和帮助。我最终以一种非常简单的方式解决了这个问题。见下文:
if(socket.connected){
//在这里做你的事
}否则{
//在这里抛出一个错误,告诉用户他们的互联网很可能已关闭
}
希望这对其他人有所帮助,这是我们代码中的一个巨大改进,可以确保用户在短暂的网络/互联网中断时获得正确的反馈。很清楚您想要什么,但不清楚您的具体问题是什么。大多数(如果不是全部的话)需求都必须手动实现:跟踪连接状态,如果用户在连接断开后单击,显示错误,取消单击,等等。很清楚您想要什么,但不清楚您的具体问题是什么。大多数(如果不是全部的话)需求都必须手动实现:跟踪st