在node.js中使用https.request时,套接字挂起

当使用https.request和node.js v04.7时,出现以下错误:

Error: socket hang up at CleartextStream.<anonymous> (http.js:1272:45) at CleartextStream.emit (events.js:61:17) at Array.<anonymous> (tls.js:617:22) at EventEmitter._tickCallback (node.js:126:26) 

简化的代码将会产生错误:

 var https = require('https') , fs = require('fs') var options = { host: 'localhost' , port: 8000 , key: fs.readFileSync('../../test-key.pem') , cert: fs.readFileSync('../../test-cert.pem') } // Set up server and start listening https.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}) res.end('success') }).listen(options.port, options.host) // Wait a second to let the server start up setTimeout(function() { var clientRequest = https.request(options, function(res) { res.on('data', function (chunk) { console.log('Called') }) }) clientRequest.write('') clientRequest.end() }, 1000) 

即使服务器和客户端运行在不同的节点实例上,我也会得到错误,并且使用端口8000,3000和443以及带和不带SSL证书进行了testing。 我的Ubuntu机器上有libssl和libssl-dev。

任何想法可能是什么原因?

https.createServer(function (req, res) {

您在创build服务器时缺less选项,应该是:

https.createServer(options, function (req, res) {

与你的钥匙和证书里面

我有一个非常类似的问题,响应的结束事件从未被解雇。

添加这一行解决了这个问题:

 // Hack to emit end on close because of a core bug that never fires end response.on('close', function () {response.emit('end')}); 

我在前面的答案中提到的请求库中find了一个这样的例子。

简短的回答: 使用最新的源代码,而不是你有。 把它存储在你想要的地方,然后需要它,你很好走。


在请求1.2.0源代码中,我看到main.js第76行

 http.createClient(options.uri.port, options.uri.hostname, options.uri.protocol === 'https:'); 

看看http.js源代码 ,我明白了

 exports.createClient = function(port, host) { var c = new Client(); c.port = port; c.host = host; return c; }; 

它使用3个参数进行请求,但实际function只有2个。该function被replace为https的单独模块。

看看最新的main.js源代码 ,我看到了巨大的变化。 最重要的是添加require('https')

看起来这个请求已经被修复,但从未被重新发布。 幸运的是,如果您只是从最新的main.js源代码的原始视图手动复制并使用它,那么修复程序似乎可以正常工作。

我有一个类似的问题,我想我得到了一个修复。 但后来我有另一个套接字问题。 在这里查看我的解决scheme: http : //groups.google.com/group/nodejs/browse_thread/thread/9189df2597aa199e/b83b16c08a051706?lnk=gst&q=hang+up#b83b16c08a051706

关键点:使用0.4.8,http.request代替http.createClient。

然而,新的问题是,如果我让程序运行了很长时间,(我实际上离开程序运行,但在周末没有活动),那么当我向http服务器发送请求时,将会发生套接字挂起错误。 (甚至没有达到http.request)。 我不知道是因为我的代码,还是与http服务器不同的问题