নোডেজের 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"( nodejs.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 এটি req.end()স্বয়ংক্রিয়ভাবে কল ব্যতীত http.request হিসাবে একই কাজ করে।

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ভেরিয়েবলটিতে এইচটিএমএল পাইনি ।
এসএসএইচ এই

1
@ এসএসএইচ কারণ এটি কাঁচা ডেটাযুক্ত বাফার বস্তু ছিল। আপনি যদি সেগুলি থেকে স্ট্রিং চেয়েছিলেন তবে আপনি chunk.toString () ব্যবহার করতে পারেন, optionচ্ছিকভাবে স্ট্রিং এবং এনকোডিংয়ে যাচ্ছেন। এটি বলেছে যে, সেট এনকোডিং সম্ভবত আরও দক্ষ।
skeggse

14
"ডেটা" ইভেন্টটি একাধিকবার ডাকা হতে পারে এবং আপনি টুকরো টুকরো করে সামগ্রীটি পাবেন। উদাহরণগুলি কীভাবে তাদের একসাথে আঠালো তা দেখায় না।
আন্দ্রেজ

4
@tfmontague। একমত! অবাক করা ... উত্তরের ভিত্তিতে ত্রুটিযুক্ত একটি উত্তরের জন্য এতগুলি উত্সাহ।
সানি

@ টিফমন্টিগ: POST requests typically use a response body, not 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 অনুরোধ থেকে একটি প্রতিক্রিয়া পেতে, callbacks এড়ানো এবং.then()

আপনাকে এমন একটি HTTP ক্লায়েন্টও ব্যবহার করতে হবে যা প্রতিশ্রুতি দেয়। http.get()এখনও একটি অনুরোধ অবজেক্ট ফেরত দেয়, যাতে এটি কাজ করে না। আপনি ব্যবহার করতে পারেন fetch, তবে superagentএকজন পরিপক্ক এইচটিটিপি ক্লায়েন্ট যা আরও সাধারণ যুক্ত ডিফল্ট বৈশিষ্ট্যগুলি সহ আরও সাধারণ ক্যোয়ারিং স্ট্রিং এনকোডিং, সঠিকভাবে মাইম প্রকারগুলি ব্যবহার করে, ডিফল্টরূপে জেএসএন এবং অন্যান্য সাধারণ এইচটিটিপি ক্লায়েন্ট বৈশিষ্ট্য রয়েছে। awaitপ্রতিশ্রুতির কোনও মূল্য না হওয়া পর্যন্ত অপেক্ষা করা হবে - এই ক্ষেত্রে, একটি এইচটিটিপি পুনরায় বিপরীতে!

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);
  });
};

আপনি এটিকে একটি এসিঙ্ক ফাংশন থেকে এটি কল করতে পারেন:

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

11

আপনি যদি .get ব্যবহার করতে চান তবে আপনি এটি এটি করতে পারেন

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

});

2
অন্যান্য অংশগুলি আমাকে হেক্সের মানগুলির মতো দেখতে দেয় যখন আমি খণ্ড প্রতিক্রিয়া সহ পাঠ্য অন্তর্ভুক্ত করি না। এনকোডিং সেট করা আমি যে JSON দস্তাবেজটি খুঁজছিলাম তা প্রদর্শিত হয়েছিল। ধন্যবাদ!
কলিন ম্যাকগুইয়ার

@ কলিনম্যাকগুইয়ের কারণ এটি হ'ল কাঁচা ডেটাযুক্ত বাফার অবজেক্ট। আপনি যদি সেগুলি থেকে স্ট্রিং চেয়েছিলেন তবে আপনি optionচ্ছিকভাবে chunk.toString()পাসিং toStringএবং এনকোডিংও ব্যবহার করতে পারেন । এটি বলেছিল, setEncodingসম্ভবত আরও দক্ষ।
skeggse

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()

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আপনি যে ডকুমেন্টেশনগুলির সাথে লিঙ্ক করেছেন তা পড়লে বোঝা যায় যে আপনি এটি পোস্ট করার পরেও এটি কেস ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.