2012-05-27 21 views
6

मैंने the sample from the documentation को आजमाया है और यह बहुत अच्छा काम करता है।Node.js Https अनुरोध त्रुटि

लेकिन जब मैं https://api.mercadolibre.com/sites/ पर यूआरएल बदलता हूं, तो अनुरोध लटकता है। केवल एक चीज मैं मिलता है:

var https = require('https'); 

this.dispatch = function(req, res) { 
    var renderHtml = function(content) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end(content, 'utf-8'); 
    } 

    var parts = req.url.split('/'); 

    var options = { 
    host: 'api.mercadolibre.com', 
    port: 443, 
    path: '/sites/', 
    method: 'GET' 
    }; 

    var request = https.request(options, function(res) { 
    console.log("statusCode: ", res.statusCode); 
    console.log("headers: ", res.headers); 

    res.on('data', function(d) { 
     process.stdout.write(d); 
    }); 
    }); 

    request.on('error', function(e) { 
    console.error('error'); 
    console.error(e); 
    }); 

    request.end(); 
    return 'item id:' + parts[2]; 
}; 

मैं कर्ल, soapui साथ और एक ब्राउज़र के साथ की कोशिश की है:

{ [Error: socket hang up] code: 'ECONNRESET' } 

यहाँ मेरी कोड है। सभी मामलों में महान काम करता है, लेकिन node.js के साथ यह नहीं करता है।

मैं क्या हो रहा है पर अधिक डेटा कैसे प्राप्त कर सकता हूं?

जोड़ा कर्ल मुझे क्या है: --sslv3 https://api.mercadolibre.com/sites/ काम करता है कर्ल। मैंने सेंटोस 6 में भी परीक्षण किया है और यह भी काम करता है। मैंने इस समय स्रोत, एक ही समस्या से नोड को पुनर्स्थापित कर दिया है। मेरा ओएस उबंटू 12.04 है। धन्यवाद।

+0

आप यू को दिखाने के लिए की आवश्यकता होगी आप इसका उपयोग कर रहे हैं ताकि हम इस मुद्दे का निदान कर सकें। – Ashe

उत्तर

2

क्यों आपके लिए विवरणों का निपटारा करने के लिए request जैसी लाइब्रेरी का उपयोग नहीं करें?

var request = require('request'); 

request('https://api.mercadolibre.com/sites/', {}, function(err, res, body) { 
    console.log("Got body: ", body); 
}); 

यह पैदावार:

Got body: [{"id":"MLA","name":"Argentina"},{"id":"MLB","name":"Brasil"},{"id":"MCO","name":"Colombia"},{"id":"MCR","name":"Costa Rica"},{"id":"MEC","name":"Ecuador"},{"id":"MLC","name":"Chile"},{"id":"MLM","name":"Mexico"},{"id":"MLU","name":"Uruguay"},{"id":"MLV","name":"Venezuela"},{"id":"MPA","name":"Panamá"},{"id":"MPE","name":"Perú"},{"id":"MPT","name":"Portugal"},{"id":"MRD","name":"Dominicana"}] 
+0

बिल्कुल वही बात। मैं क्या हो रहा है पर अधिक डेटा कैसे प्राप्त कर सकता हूं? –

+0

जब आप "बिल्कुल वही बात" कहते हैं, तो क्या आपका मतलब है कि आप '{[त्रुटि: सॉकेट लटका] कोड देखते हैं: 'ECONNRESET'} फिर से? ऐसा लगता है जैसे वे आपके आईपी, या कुछ से एक्सेस अवरुद्ध कर सकते हैं। – Ashe

+0

हाँ बिल्कुल वही। मैं अपने आईपी को अवरुद्ध करने में कुछ नहीं सोचता, शायद कुछ node.js अनुरोध अवरुद्ध कर रहा है। अभी के लिए मैं नोड स्क्रिप्ट (और काम करता है) के अंदर निष्पादन कर्ल हूं जबकि मुझे पता है कि क्या होता है। क्या मेरे अनुरोध को अवरुद्ध करने के बारे में अधिक जानकारी प्राप्त करने का कोई तरीका है? –

0

मुझे लगता है कि यदि आप किसी प्रॉक्सी जो आप अनुरोध करने के लिए निर्दिष्ट करने की आवश्यकता के पीछे हैं। प्रॉक्सी सेटिंग्स स्वचालित रूप से libcurl द्वारा पाई जाती हैं, जो नोड-कर्ल उपयोग करता है। इसलिए अनुरोध नोड-कर्ल में गुजरता है।

इसलिए, प्रॉक्सी आईपी और बंदरगाह अपने संगठन का उपयोग करता है पता लगाना है, और इस प्रयास करें:

var request = require('request'); 
request({ 
    uri : 'https://mail.google.com/mail', 
    proxy : 'http://<proxy ip>:<proxy port>' 
}, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     console.log(body) // Print the google web page. 
    }else{ 
     console.log(error); 
     console.log(response.statusCode); 
    } 
}) 
3

चूंकि यह कर्ल के साथ काम कर रहा है, नोड कर्ल मॉड्यूल का उपयोग कर प्रयास करें। जब तक मैंने नोड-कर्ल पर स्विच नहीं किया, तब तक मैंने http और/या https मॉड्यूल के साथ node.js में काम करने की कोशिश करने का पूरा दिन खो दिया।

इस प्रयास करें:

var curl = require('node-curl'); 
curl('https://api.mercadolibre.com/sites/', {SSLVERSION: 3}, function(err, res) { 
    var body = res.body; 
    res.close(); 
    console.log(body); 
}); 
7

मैं api.mercadolibre.com साइट के बारे में निश्चित नहीं हूँ, लेकिन मैं एपीआई कॉल कर सकते हैं अगर मैं port परम निकालने के लिए, निम्न कोड की तरह:

var options = { 
    host: 'api.mercadolibre.com', 
    path: '/sites/', 
    method: 'GET' 
}; 

और हम भी जोड़ की जरूरत है एसएसएल संस्करण 3:

https.globalAgent.options.secureProtocol = 'SSLv3_method'; 
+2

'SSLv3_method' ने मुझे 2 साल पुरानी समस्या हल करने में मदद की! आपका बहुत बहुत धन्यवाद! –

1

वही, कर्ल के साथ काम करना, लेकिन साथ नहीं node.js.

समस्या: यहां CentOS-5 कर्ल usesthe पर openssl पुस्तकालय प्रदान करता है और इसलिए सीए चेक के लिए Centos मानक /etc/pki/tls/certs/ca-bundle.crt का उपयोग करता है।

जहां stode के माध्यम से node.js ढूंढता है ?, मैं जांच के लिए सीए-फाइल का कोई संदर्भ नहीं देख सकता। ज्ञात पुराने जारीकर्ता से वैध SSL-प्रमाणपत्र के साथ सर्वर के खिलाफ Node.js अनुरोध स्वीकार किए जाते हैं, लेकिन अपने स्वयं के वेबसर्वर के खिलाफ अपने सीए के साथ नहीं। मैंने अपना स्वयं का CA.crt ca-bundle.crt फ़ाइल में रखा है, इसलिए अब कर्ल इसे स्वीकार करता है, लेकिन node.js. नहीं।,

post_options.path = 'history'; 
... 
var req = http.request(post_options, function(res) { 
... 

है कि तुम:

var client = require('https'); 
    var download_options = url.parse(sourceUrl); 
    download_options.method = "GET"; 
    download_options.agent = false; 
    download_options.rejectUnauthorized = false;/HERE to accept all SSL-certificates */ 

    var download_request = client.request(download_options); 
0

आप यदि आप ऐसा करते ECONNRESET त्रुटि प्राप्त होगी:

अब के लिए केवल समाधान मेरी देव-बॉक्स के लिए सत्यापन की जांच को निष्क्रिय करने के लिए है सुनिश्चित करें कि आपके पथ एक / इस तरह है बनाने की जरूरत है:

post_options.path = '/history'; 
... 
संबंधित मुद्दे