在node.js webserver中写入错误后

由于“write after end”错误,我正在为自己的node.js爱好项目苦苦挣扎。 我创build了一个node.jsnetworking服务器,其中包括使用以下代码将从HTML页面接收的命令发送到另一个进程:

var netSocket = require('net').Socket(); netSocket.connect(9090); netSocket.write(messages); netSocket.end(); 

这个工作,直到stream量开始增加(即消息的数量和消息的大小)。 在这一点上,我得到以下错误:

 Error: write after end at writeAfterEnd (_stream_writable.js:132:12) at Socket.Writable.write (_stream_writable.js:180:5) at Socket.write (net.js:615:40) at Socket.<anonymous> (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/speech_module/web_server_HTTPS.js:66:15) at Socket.emit (events.js:95:17) at Socket.onevent (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/socket.js:327:8) at Socket.onpacket (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/socket.js:287:12) at Client.ondecoded (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/lib/client.js:193:14) at Decoder.Emitter.emit (/Users/mark/Documents/GitHub Repos/voice_controlled_zumo/node_modules/socket.io/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20) 

我的猜测是,9090的服务器正在被stream量所淹没,导致错误。 作为node.js世界中的一个完整的新手,我真的很感激我如何解决这个问题的任何提示。

还要注意的是,networking服务器通过SSL提供页面(如果有任何区别的话)。

感谢您抽时间阅读!

标记

node.js是一个非阻塞的asynchronous平台。

在你的情况下,

 netSocket.write(messages); 

是一个asynchronous方法,因此netSocket.end()在“写入”完成之前被调用。

正确的用法是:

 netSocket.write(messages, function(err) { netSocket.end(); }); 

这里的第二个参数是一个callback函数,一旦'写'方法完成它的工作,将被调用。

我build议你阅读/观看更多关于node.js,asynchronous样式和callback。

这里是一个很好的开始: https : //www.youtube.com/watch?v=GJmFG4ffJZU

当然还有关于net sockets的node.js API文档 。

希望它帮助:)

首先,我想在关于socket.write()socket.end()另一个答案中有错误的信息。 把它们连接在同一个刻度上是完全正常的。

 socket.write(everythingIPlanToSend); socket.end(); 

你不需要提供callback来write 。 callback会告诉你什么时候数据已经被刷新了连接,但这是一个可选的通知,典型的程序不需要关心自己。

但是,看着你的堆栈跟踪,我认为你的事件处理控制stream程以这种方式被破坏。 你有一个socket.io客户端连接,并发出你听的事件。 当这些事件触发时,您将它们发送到您的上游服务器。 然后结束上游套接字连接。 在这一点上,你必须解除绑定( removeListener )你的socket.io连接监听器,这样当更多的事件到达时,你不要试图发送你已经closures的连接。

另一种说法是,只要在上游套接字中调用.end() ,就必须确保来自浏览器的未来传入事件不会使用同一个套接字。 或者你必须改变你的代码使用相同的浏览器套接字的所有事件相同的上游套接字(这可能是更高效/正确),但在这种情况下不要调用.end() ,直到浏览器套接字实际断开。

我有节点模块压缩类似的问题,我更新到最新版本1.6后,问题已解决

 npm install compression@1.6.0