节点.js Web 服务器中的结束后写入错误
Write After End error in node.js webserver
由于"结束后写入"错误,我正在努力处理我的节点.js爱好项目。 我创建了一个节点.js Web服务器,除其他外,使用以下代码将从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 处的服务器被流量淹没,从而导致错误。 作为节点世界中的完全新手.js我非常感谢有关如何解决此问题的任何提示。
另请注意,网络服务器通过SSL提供页面(以防有任何差异)。
感谢您抽出宝贵时间阅读本文!
马克
NodeJS是一个非阻塞异步平台。
在您的情况下,
netSocket.write(messages);
是一个异步方法;因此,在 write
完成之前调用 netSocket.end()
。
正确的用法是:
netSocket.write(messages, function(err) { netSocket.end(); });
这里的第二个参数是一个回调函数,一旦"write"方法完成其工作,就会调用该函数。
我建议您阅读/观看更多关于 NodeJS、异步样式和回调的信息。
这是一个很好的起点:https://www.youtube.com/watch?v=GJmFG4ffJZU
当然,还有关于网络套接字的 NodeJS API 文档。
首先,我认为另一个关于socket.write()
和socket.end()
的答案中存在错误信息。在同一刻度中背靠背做它们是完全正常和可以的:
socket.write(everythingIPlanToSend);
socket.end();
您无需提供对 write
的回调。回调将告诉您数据何时完全清除连接,但这是一个可选通知,典型程序不需要关注自己。
但是,查看您的堆栈跟踪,我认为您的事件处理控制流以这种方式中断。您连接了一个 socket.io 客户端,该客户端会发出您侦听的事件。当这些事件触发时,您将它们发送到上游服务器。然后结束上游套接字连接。此时,您必须取消绑定(removeListener
)socket.io 连接侦听器,以便在更多事件到达时,您不会尝试将它们发送到已关闭的连接。
另一种说法是,每当您在上游套接字上调用.end()
时,都必须确保将来来自浏览器的传入事件不会使用相同的套接字。或者您必须更改代码以对来自相应浏览器套接字的所有事件使用相同的上游套接字(这可能更有效/更正确),但在这种情况下,在浏览器套接字实际断开连接之前不要调用.end()
。
我在节点模块压缩方面遇到了类似的问题,将其更新到最新版本 1.6 后,问题已解决
npm install compression@1.6.0
- 使用nunjucks时发生块结束错误
- jQuery Ajax+经典ASP返回错误'意外的输入结束'
- Json响应错误Json.parse:意外的数据结束错误
- json错误json.parse:意外的数据结束错误
- `同构的fetch`response.json()方法总是抛出意外的输入结束错误
- js文件的第1行出现意外的输入结束错误
- 未捕获的语法错误:输入JavaScript意外结束
- 节点.js未定义:1 [语法错误:输入意外结束]
- Mixpanel javascript 集成:连续的事件在 mixpanel 结束时以错误的顺序记录
- 错误:在 get 中结束 - 节点后请求(模块)管道后请求后写入
- Ajax 调用返回语法错误:输入意外结束
- 节点.js结束错误 zlib 后写入
- 谷歌浏览器:语法错误:输入意外结束
- 节点.js Web 服务器中的结束后写入错误
- 使用 knex 从文件读取并插入数据库结束错误
- 语法错误:JSON.parse:意外的数据结束
- 未捕获的语法错误:输入时刻意外结束.min.js:7
- Confluence REST API请求在不是管理员时以401错误结束
- 伊斯坦布尔为我提供了覆盖,但以错误结束输出
- Javascript替换未定义的错误结束,但不替换继续