如何处理';读取ETIMEDOUT';在Node.js中?

如何处理';读取ETIMEDOUT';在Node.js中?,node.js,networking,proxy,real-time,publish-subscribe,Node.js,Networking,Proxy,Real Time,Publish Subscribe,我有一个pub/sub模型,它使用Node.js将数据从一个客户端传输到另一个客户端。此外,服务器还记录接收到的所有内容并将其发送给新客户端 但是,一些数据在传输时损坏,我得到了如下错误: Error with socket! { [Error: write EPIPE] code: 'EPIPE', errno: 'EPIPE', syscall: 'write' } Error with socket! { [Error: read ETIMEDOUT] code: 'ETIMEDOUT',

我有一个pub/sub模型,它使用Node.js将数据从一个客户端传输到另一个客户端。此外,服务器还记录接收到的所有内容并将其发送给新客户端

但是,一些数据在传输时损坏,我得到了如下错误:

Error with socket!
{ [Error: write EPIPE] code: 'EPIPE', errno: 'EPIPE', syscall: 'write' }
Error with socket!
{ [Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }
我不知道如何正确处理这些错误。客户机好像停机了

因为服务器只是一个类似服务器的代理,所以它并不真正知道数据的含义。我不知道如何在遇到这些错误之前验证每个数据包

这是我的密码:

// server is an object inheriting from net.Server
server.on('listening', function() {
    var port = server.address().port;
}).on('connection', function(cli) {
    cli.socketBuf = new Buffers();
    cli.commandStarted = false;
    cli.dataSize = 0;
    cli.setKeepAlive(true, 10*1000);
    cli.setNoDelay(true);
    cli.on('connect', function() {
        server.clients.push(cli);
    }).on('close', function() {
        var index = server.clients.indexOf(cli);
        server.clients.splice(index, 1);
    }).on('data', function (buf) {
        server.emit('data', cli, buf);
        if(op.autoBroadcast) {
            _.each(server.clients, function(c) {
                if(c != cli) c.write(buf);
            });
        }
    }).on('error', function(err) {
        console.log('Error with socket!');
        console.log(err);
    });
}).on('error', function(err) {
    console.log('Error with server!');
    console.log(err);
});

// ...

// room.dataSocket is an instance of server beyond
room.dataSocket.on('data', function(cli, d) {
    // bf is a buffered file
    bf.append(d);
    room.dataFileSize += d.length;
    
}).on('connection', function(con){
    bf.readAll(function(da) {
        con.write(da);
    });
});

如果您在写入时遇到EPIPE或任何错误,则表示对等方已关闭或连接已断开。因此,您必须在该点关闭连接


如果您获得读取超时,则推断您设置了一个不现实的短超时,或者对等方未能及时交付:在第二种情况下,您应再次假定连接已关闭,并将其关闭。

谢谢!那么我应该删除接收到的数据吗?@liuyanghjerry这完全取决于你在做什么。@liuyanghjerry呃,很遗憾你问了一个无法回答的问题,这个问题完全是关于你的应用程序是如何工作的,而不是你问的API。