Node.js中setInterval结合socket.write触发EPIPE错误的解决方案
Node.js net.Socket 定时写入数据EPIPE错误解决
需求与初始代码
Node.js开发场景下,需要通过net.Socket客户端定时向指定端口写入数据。初始可正常执行单次写入的代码如下:
var net = require('net'); var PORT = 3000; var client = new net.Socket(); client.connect(PORT, function(){ client.write('{printing}'); })
为了实现每隔10秒写入一次相同数据,调整代码后无法正常运行:
client.connect(PORT, function(){ setInterval(function(){ client.write('{ printing }'); },10000); })
报错信息
运行后持续抛出EPIPE错误,日志如下:
node:events:355 throw er; // Unhandled 'error' event ^ Error: write EPIPE at afterWriteDispatched (node:internal/stream_base_commons:160:15) at writeGeneric (node:internal/stream_base_commons:151:3) at Socket._writeGeneric (node:net:773:11) at Socket._write (node:net:785:8) at writeOrBuffer (node:internal/streams/writable:395:12) at Socket.Writable.write (node:internal/streams/writable:340:10) at Timeout._onTimeout (/app/src/index.js:135:14) at listOnTimeout (node:internal/timers:557:17) at processTimers (node:internal/timers:500:7) Emitted 'error' event on Socket instance at: at emitErrorNT (node:internal/streams/destroy:188:8) at emitErrorCloseNT (node:internal/streams/destroy:153:3) at processTicksAndRejections (node:internal/process/task_queues:81:21) { errno: -32, code: 'EPIPE', syscall: 'write' } [nodemon] app crashed - waiting for file changes before starting..
错误原因
EPIPE错误的核心成因是向已经被对端关闭的Socket连接写入数据,多数场景下是服务端完成单次通信后主动断开了连接,后续定时写入时连接已经失效,且初始代码没有监听Socket的错误、断开事件,也没有重连逻辑,直接触发未捕获异常导致程序崩溃。
修复代码
通过监听Socket全生命周期事件、增加异常重连逻辑即可解决问题,最终可用代码如下:
client.connect(PORT, function(){ client.write('printing') }) // 缓冲区满时触发drain事件,排空缓冲区后再执行写入避免数据丢失 client.on('drain',()=>{ console.log("draining the buffer") setTimeout(() => { client.write('printing') }) // 消费服务端返回的响应数据(示例中响应为"ok") client.on('data', (data) => {}) // 错误捕获+断连自动重连逻辑 client.on('error',err => {}).on('close',() => { setTimeout(() => { client.connect(PORT, function(){ client.write('printing') }) },40000) })
内容的提问来源于stack exchange,提问作者user5235751
相关产品推荐
相关产品推荐

