由于“结束后写入”错误,我正在为我的 node.js 爱好项目而苦苦挣扎。我创建了一个 node.js 网络服务器,其中包括使用以下代码将从 HTML 页面接收到的命令发送到另一个进程:
var netSocket = require('net').Socket();
netSocket.connect(9090);
netSocket.write(messages);
netSocket.end();
这一直有效,直到流量开始增加(即正在发送的消息量和/或消息的大小)。此时我收到以下错误:
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 的服务器被流量淹没,导致错误。作为 node.js 领域的新手,我非常感谢任何有关如何解决此问题的提示。
另请注意,网络服务器正在通过 SSL 提供页面(以防万一)。
感谢您抽出宝贵时间阅读本文!
标记
最佳答案
NodeJS 是一个非阻塞异步平台。
在你的情况下,
netSocket.write(messages);
是一个异步方法;因此,netSocket.end()
在 write
完成之前被调用。
正确的用法是:
netSocket.write(messages, function(err) { netSocket.end(); });
这里的第二个参数是一个回调函数,一旦'write'方法完成它的工作就会被调用。
我建议您阅读/观看有关 NodeJS、异步样式和回调的更多信息。
这是一个很好的起点:https://www.youtube.com/watch?v=GJmFG4ffJZU
当然还有 NodeJS API docs关于网络套接字。
关于javascript - 在 node.js 网络服务器中写入结束后错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769842/