एक नोडजेज़ http.get प्रतिक्रिया में शरीर कहाँ है?


187

मैं http://nodejs.org/docs/v0.4.0/api/http.html#http.request पर डॉक्स पढ़ रहा हूं , लेकिन किसी कारण से, मैं वास्तव में शरीर / डेटा विशेषता को खोजने के लिए प्रतीत नहीं हो सकता लौटी, समाप्त प्रतिक्रिया ऑब्जेक्ट।

> var res = http.get({host:'www.somesite.com', path:'/'})

> res.finished
true

> res._hasBody
true

यह समाप्त हो गया है (http.get यह आपके लिए करता है), इसलिए इसमें किसी प्रकार की सामग्री होनी चाहिए। लेकिन कोई शरीर नहीं है, कोई डेटा नहीं है, और मैं इससे नहीं पढ़ सकता हूं। शरीर कहाँ छुपा है?


7
चूंकि उत्तर में से कोई भी उल्लेख नहीं करता है कि dataघटनाओं के होने पर आपको कैसे पता चलेगा .. क्या आपकी resबात सुनने के लिए है "end"( ndjs.org/docs/latest/api/http.html#event_end_ )
SooDesuNe

जवाबों:


172

http.request डॉक्स में उदाहरण है कि हैंडलिंग dataइवेंट के माध्यम से प्रतिक्रिया का शरीर कैसे प्राप्त करें :

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

http.get वही कार्य करता है जो http.request को छोड़कर req.end()स्वचालित रूप से कॉल करता है ।

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/index.html'
};

http.get(options, function(res) {
  console.log("Got response: " + res.statusCode);

  res.on("data", function(chunk) {
    console.log("BODY: " + chunk);
  });
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

15
किसी कारण से, मुझे res.setEncoding('utf8');http.get उदाहरण में जोड़ना पड़ा । अन्यथा मुझे chunkवेरिएबल में HTML नहीं मिला ।
SSH

1
@ यह इसलिए है क्योंकि वे कच्चे डेटा वाले बफर ऑब्जेक्ट थे। यदि आप उनसे स्ट्रिंग्स चाहते थे तो आप chunk.toString () का उपयोग कर सकते हैं, वैकल्पिक रूप से स्टर्लिंग और एन्कोडिंग से गुजर सकते हैं। उस ने कहा, setEncoding की संभावना अधिक कुशल है।
कंकाल

14
"डेटा" घटना को कई बार कहा जा सकता है और आपको सामग्री टुकड़ा द्वारा मिल जाएगी। उदाहरण यह नहीं दिखाता कि उन्हें एक साथ कैसे गोंद दिया जाए।
Andrej

4
@tfmontague। माना! हैरानी की बात है ... एक उत्तर के लिए बहुत सारे उत्थान जो इसकी बहुत नींव पर त्रुटिपूर्ण हैं।
सनी

@tfmontague: POST requests typically use a response body, not GET.पोस्ट अनुरोध में एक निकाय होता है और GET अनुरोध नहीं होता है, लेकिन GET प्रतिक्रिया में एक निकाय हो सकता है।
सिरबिल

135

मैं यह भी जोड़ना चाहता हूं कि जिस http.ClientResponseरिटर्न http.get()की एक endघटना है, इसलिए यहां एक और तरीका है जिससे मुझे बॉडी रिस्पांस मिलता है:

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/index.html'
};

http.get(options, function(res) {
  var body = '';
  res.on('data', function(chunk) {
    body += chunk;
  });
  res.on('end', function() {
    console.log(body);
  });
}).on('error', function(e) {
  console.log("Got error: " + e.message);
}); 

13
उसके लिए धन्यवाद! मेरे लिए 'अंत' की घटना महत्वपूर्ण थी क्योंकि मुझे चांस के बजाय प्रतिक्रिया शरीर को एक पूरे के रूप में संसाधित करना था।
डैनियल ग्रूसज़िक

http.ClientResponsehttp.get() http.ClientRequestवर्तमान डाक्यूमेंट और मूल पोस्टर द्वारा लिंक किए गए दस्तावेज दोनों के अनुसार नहीं लौटा है ।
विंस

54

संपादित करें: 6 साल बाद स्वयं को जवाब देना

इंतजार कीवर्ड का सबसे अच्छा तरीका एक HTTP अनुरोध से एक प्रतिक्रिया प्राप्त करने के लिए, कॉलबैक से परहेज है और.then()

आपको एक HTTP क्लाइंट का उपयोग करने की भी आवश्यकता होगी जो वादा करता है। http.get()अभी भी एक अनुरोध ऑब्जेक्ट देता है, ताकि काम नहीं करेगा। आप उपयोग कर सकते हैं fetch, लेकिन superagentएक परिपक्व HTTP क्लाइंट है जो सरल क्वेरी स्ट्रिंग एन्कोडिंग, माइम प्रकारों का उपयोग करके, डिफ़ॉल्ट रूप से JSON, और अन्य सामान्य HTTP क्लाइंट सुविधाओं सहित अधिक उचित चूक की सुविधा देता है। awaitइंतजार करेंगे जब तक कि प्रॉमिस का मूल्य नहीं है - इस मामले में, एक HTTP रिपॉजिट!

const superagent = require('superagent');

(async function(){
  const response = await superagent.get('https://www.google.com')
  console.log(response.text)
})();

वेट का उपयोग करते हुए, नियंत्रण केवल अगली पंक्ति पर गुजरता है जब एक बार वादा superagent.get()किया गया मूल्य वापस आ जाता है।


3
यह आपके मूल प्रश्न का उत्तर नहीं देता है। आपके उदाहरण कोड में, resके रिटर्न मान पर सेट किया गया है superagent.get(), नहीं http.get()। एक संपत्ति है कि http.get()एक रिटर्न http.IncomingMessageनहीं है text। यह प्रतिक्रिया वस्तु नहीं है, यह अनुरोध वस्तु है।
विंस

अच्छी बात यह है कि मैं इसका जवाब देता हूँ कि इसे साफ करने के लिए मैं एक HTTP क्लाइंट का उपयोग कर रहा हूँ जो वादे का समर्थन करता है।
मिकमेककाना

12

dataघटना शरीर के 'हिस्सा' के रूप में वे डाउनलोड कर रहे हैं और एक से अधिक बार निकाल दिया जाता है endघटना है जब सभी टुकड़ों डाउनलोड किया गया है।

नोड्स के साथ अब वादे का समर्थन करते हुए , मैंने एक साधारण रैपर को एक वादा के माध्यम से समसामयिक विखंडू वापस करने के लिए बनाया:

const httpGet = url => {
  return new Promise((resolve, reject) => {
    http.get(url, res => {
      res.setEncoding('utf8');
      let body = ''; 
      res.on('data', chunk => body += chunk);
      res.on('end', () => resolve(body));
    }).on('error', reject);
  });
};

आप इसे async फ़ंक्शन से कॉल कर सकते हैं:

const body = await httpGet('http://www.somesite.com');

11

यदि आप उपयोग करना चाहते हैं तो आप इसे इस तरह से कर सकते हैं

http.get(url, function(res){
    res.setEncoding('utf8');
    res.on('data', function(chunk){
        console.log(chunk);
    });

});

2
दूसरे उदाहरणों ने मुझे वही दिया जो हेक्स मूल्यों की तरह दिखता था जब मैंने पाठ को चंक प्रतिक्रिया के साथ शामिल नहीं किया था। एन्कोडिंग सेट करना उस JSON दस्तावेज़ को प्रदर्शित करता है जिसकी मुझे तलाश थी। धन्यवाद!
कॉलिन मैकगायर

@CollinMcGuire ऐसा इसलिए है क्योंकि वे कच्चे डेटा वाले बफर ऑब्जेक्ट थे। यदि आप उनसे स्ट्रिंग्स चाहते थे, तो आप chunk.toString()वैकल्पिक रूप से पास toStringऔर एन्कोडिंग का भी उपयोग कर सकते थे । उस ने कहा, setEncodingसंभावना अधिक कुशल है।
कंकाल

6

आपको एक श्रोता को अनुरोध में जोड़ना होगा क्योंकि नोड.जैसे अतुल्यकालिक काम करता है:

request.on('response', function (response) {
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
 });
});

2

सुई मॉड्यूल भी अच्छा है, यहां एक उदाहरण है जो needleमॉड्यूल का उपयोग करता है

var needle = require('needle');

needle.get('http://www.google.com', function(error, response) {
  if (!error && response.statusCode == 200)
    console.log(response.body);
});

0

कॉफी का एक हिस्सा यहां:

# My little helper
read_buffer = (buffer, callback) ->
  data = ''
  buffer.on 'readable', -> data += buffer.read().toString()
  buffer.on 'end', -> callback data

# So request looks like
http.get 'http://i.want.some/stuff', (res) ->
  read_buffer res, (response) ->
    # Do some things with your response
    # but don't do that exactly :D
    eval(CoffeeScript.compile response, bare: true)

और संकलित किया

var read_buffer;

read_buffer = function(buffer, callback) {
  var data;
  data = '';
  buffer.on('readable', function() {
    return data += buffer.read().toString();
  });
  return buffer.on('end', function() {
    return callback(data);
  });
};

http.get('http://i.want.some/stuff', function(res) {
  return read_buffer(res, function(response) {
    return eval(CoffeeScript.compile(response, {
      bare: true
    }));
  });
});

0

आपको वापसी मूल्य से प्रतिक्रिया का शरीर नहीं मिल सकता है http.get()

http.get()प्रतिक्रिया ऑब्जेक्ट वापस नहीं करता है। यह अनुरोध वस्तु ( http.clientRequest) लौटाता है । इसलिए, वापसी के मूल्य से प्रतिक्रिया के शरीर को प्राप्त करने का कोई तरीका नहीं है http.get()

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन आपके द्वारा लिंक किए गए दस्तावेज़ को पढ़ने से पता चलता है कि जब आपने इसे पोस्ट किया था तब भी यह मामला था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.