在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。
关于可能是什么原因的任何想法?
答案 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服务器不同的问题