首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >node.js End服务器中的结束后写入错误

node.js End服务器中的结束后写入错误
EN

Stack Overflow用户
提问于 2015-01-05 04:11:00
回答 3查看 89.6K关注 0票数 35

由于“结束后写入”错误,我正在为我的node.js爱好项目而苦苦挣扎。我已经创建了一个HTML服务器,它使用以下代码将从node.js页面接收的命令向前发送到另一个进程:

代码语言:javascript
复制
var netSocket = require('net').Socket();
netSocket.connect(9090);
netSocket.write(messages);
netSocket.end();

这在通信量开始增加(即发送的消息数量和/或消息大小)之前一直有效。此时,我得到以下错误:

代码语言:javascript
复制
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领域的一名新手,我非常感谢任何关于我如何解决这个问题的提示。

还要注意的是,any服务器通过SSL提供页面(以防有任何不同)。

感谢您花时间阅读这篇文章!

标记

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-05 04:48:51

NodeJS是一个非阻塞异步平台。

在你的情况下,

代码语言:javascript
复制
netSocket.write(messages);

是一个异步方法;因此,在write完成之前调用netSocket.end()

正确的用法应该是:

代码语言:javascript
复制
netSocket.write(messages, function(err) { netSocket.end(); });

这里的第二个参数是一个回调函数,它将在“write”方法完成其作业后被调用。

我建议你阅读/观看更多关于NodeJS,异步样式和回调的内容。

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

当然,还有关于网络套接字的NodeJS API docs

票数 42
EN

Stack Overflow用户

发布于 2015-07-16 23:55:08

首先,我认为关于socket.write()socket.end()的另一个答案中存在错误信息。在同一个节拍中背靠背地做这些事情是非常正常和正常的:

代码语言:javascript
复制
socket.write(everythingIPlanToSend);
socket.end();

您不需要向write提供回调。回调将告诉您数据何时被完全清除出连接,但这是一个可选的通知,典型的程序不需要关心它们自己。

然而,看看你的堆栈跟踪,我认为你的事件处理控制流是以这种方式被打破的。您已经连接了一个socket.io客户端,它会发出您要侦听的事件。当这些事件触发时,您将它们转发到上游服务器。然后结束上游套接字连接。此时,您必须解除绑定(removeListener) socket.io连接侦听器,这样当更多事件到达时,您就不会试图将它们发送到已经关闭的连接上。

换句话说,每当您在上游套接字上调用.end()时,都必须确保将来从浏览器传入的事件不会使用相同的套接字。或者,您必须更改代码,以便对来自相应浏览器套接字的所有事件使用相同的上游套接字(这可能更有效/更正确),但在这种情况下,在浏览器套接字实际断开连接之前,不要对其调用.end()

票数 23
EN

Stack Overflow用户

发布于 2015-11-08 14:39:53

我在节点模块压缩方面也遇到了类似的问题,在我将其更新到最新的1.6版本后,这个问题得到了解决

代码语言:javascript
复制
npm install compression@1.6.0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27769842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档