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

时间:2011-05-04 04:52:39

标签: ssl node.js

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

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证书进行测试,我都会收到错误消息。我的Ubuntu机器上有libssl和libssl-dev。

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

4 个答案:

答案 0 :(得分:1)

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

添加此行可解决问题:

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

我在上一个答案中提到的请求库中找到了一个这样的例子。

答案 1 :(得分:1)

https.createServer(function (req, res) {

创建服务器时缺少选项,应该是:

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

使用您的密钥和证书

答案 2 :(得分:0)

简短回答: Use the the latest source code而不是您拥有的那个。把它存放在你想要的地方然后需要它,你很高兴。


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

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

查看the http.js source code,我看到了

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

请求3个参数,但实际功能只有2个。该功能被替换为https的单独模块。

the latest main.js source code,我看到了戏剧性的变化。最重要的是the addition of require('https')

看来请求已修复但从未重新发布。幸运的是,如果您只是从the raw view of the latest main.js source code手动复制并使用它,那么修复似乎有效。

答案 3 :(得分:0)

我有类似的问题,我想我得到了修复。但后来我又遇到了套接字问题。 请在此处查看我的解决方案: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服务器不同的问题