2011-07-28 30 views
4

我有一个简单的跟踪应用程序在Node.JS上运行,它基本上分析它给出的URL并返回一个1x1像素的gif图像。每天几次我在日志中得到以下错误:错误:套接字不能在Node.JS中写入

Error: Socket is not writable 
    at Socket._writeOut (net.js:391:11) 
    at Socket.write (net.js:377:17) 
    at ServerResponse._writeRaw (http.js:392:28) 
    at ServerResponse._send (http.js:372:15) 
    at ServerResponse.write (http.js:622:16) 
    at ServerResponse.end (http.js:682:16) 
    at /var/www/app.js:221:7 
    at Server.<anonymous> (/var/www/app.js:234:3) 
    at Server.emit (events.js:67:17) 
    at HTTPParser.onIncoming (http.js:1124:12) 

我绝对没有线索是什么原因造成这种情况。任何想法在哪里看? (它发生在不同的UA上,虽然直到现在我只看到它发生在请求来自Windows机器时,但考虑到绝大多数机器是Windows,这并不意味着什么)。

回答

1

您应该提交错误报告给https://github.com/joyent/node/issues?state=open

这可能是违反了通常的流写入协议在你的模块或系统HTTP模块:如果写()失败,等待漏极()事件。所以你应该在你的代码中寻找失败的写入,并且编译到/ usr/bin/node二进制文件中的HTTP javascript模块,并仔细检查是否遵守了排水等待。排水事件很少见,所以很可能这个bug已经被忽视了很长一段时间。

+0

完成。谢谢。如果发现任何相关的东西,我会在这里发布。 – joostdevries

1

此问题已被解决,因为它实际上可能是由于您使用该池的方式(即使在关闭平均值之后仍使用池中的连接)。

解决的办法是使用client.pauseDrain()来允许重用池中的单个连接。

更多的信息,这个答案的来源是here

+0

实际上并非如此。写入错误可能来自多个不同的来源(全部与套接字相关)。在你的情况下,它来自node-postgres(一个模块),但在这种情况下,它来自节点内的http模块。我使用的脚本是一个非常基本的http服务器,不应该在这些情况下抛出错误。 – joostdevries

相关问题