Node.js http से डेटा प्राप्त करने का अनुरोध कैसे प्राप्त करें


83

मैं अपना काम करने की कोशिश कर रहा हूँ http अनुरोध प्राप्त करने के लिए, हालांकि, जो कुछ भी मैं इसे खो दिया है लगता है? गुंजाइश? मैं Node.js के लिए नया छोड़ रहा हूँ, इसलिए किसी भी मदद की सराहना की जाएगी

function getData(){
  var http = require('http');
  var str = '';

  var options = {
        host: 'www.random.org',
        path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
  };

  callback = function(response) {

        response.on('data', function (chunk) {
              str += chunk;
        });

        response.on('end', function () {
              console.log(str);
        });

        //return str;
  }

  var req = http.request(options, callback).end();

  // These just return undefined and empty
  console.log(req.data);
  console.log(str);
}

जवाबों:


119

बेशक आपके लॉग वापस आते हैं undefined: आप अनुरोध पूरा होने से पहले लॉग इन करते हैं। समस्या गुंजाइश नहीं है, लेकिन अतुल्यकालिकता है

http.requestअतुल्यकालिक है, इसलिए यह पैरामीटर के रूप में कॉलबैक लेता है। कॉलबैक में आपको वही करना होगा जो आप पास करते हैं response.end:

callback = function(response) {

  response.on('data', function (chunk) {
    str += chunk;
  });

  response.on('end', function () {
    console.log(req.data);
    console.log(str);
    // your code here if you want to use the results !
  });
}

var req = http.request(options, callback).end();

10
मैं एक सरणी में विखंडू को धकेलने की सलाह दूंगा और फिर अंत में ज्वाइन ('') का उपयोग करूंगा। अगर डेटा बहुत है तो मुद्दों से
एरिक

मुझे प्रतिक्रिया (200 या 404 आदि) का HTTP प्रतिक्रिया कोड कैसे मिलेगा? क्या 'ऑन' (प्रतिक्रिया), 'डेटा' और 'एंड' कीवर्ड के बारे में कोई दस्तावेज है? क्या ये कीवर्ड हैं? यहाँ कुछ भी नहीं लगता है: nodejs.org/api/http.html#http_class_http_serverresponse
टायलर

@TylerDurden statusCodeप्रतिक्रिया ऑब्जेक्ट की एक संपत्ति है। मैं ServerResponseया तो वस्तु के लिए उचित दस्तावेज नहीं खोज सका , केवल getऔर requestतरीकों के लिए डॉक्स में उदाहरण ।
फ़ोकस

1
लेकिन इससे कोड गड़बड़ हो जाता है! जावास्क्रिप्ट को इस तरह क्यों बनाया गया है?
डैनियल

@ डैनियल अब एसिंक्रोनस इवेंट मॉडल को संभालने के लिए सुविधाएं हैं: वादे और async / प्रतीक्षा।
डेनिस सेगुरेट

16

छोटा उदाहरण http.get का उपयोग करते हुए:

require('http').get('http://httpbin.org/ip', (res) => {
    res.setEncoding('utf8');
    res.on('data', function (body) {
        console.log(body);
    });
});

यह उदाहरण लगभग उतना ही छोटा है जितना आप प्राप्त कर सकते हैं और अभी भी चला सकते हैं। यह एक अच्छा यूआरएल और छोटी प्रतिक्रिया मानता है। मैं http उदाहरणों को पसंद करता हूं जो डेटा प्रतिक्रिया को चंक करते हैं, प्रतिक्रिया endघटना का उपयोग करते हैं, और अनुरोध errrorघटना का उपयोग करते हैं ।
dturvene

2
यह उत्तर पूछे गए प्रश्न के संदर्भ से बाहर है। इसके अलावा, आप स्पष्ट रूप से नहीं सुन रहे हैं error event जिसके लिए ट्रिगर चालू हो जाएगा यदि कनेक्शन में प्रगति के दौरान कनेक्शन खो जाता है या ट्रांसमिशन के दौरान कोई अन्य समस्या होती है।
रैग

10

नोड का उपयोग करके एचटीपी अनुरोध का सरल कार्य उदाहरण।

const http = require('https')

httprequest().then((data) => {
        const response = {
            statusCode: 200,
            body: JSON.stringify(data),
        };
    return response;
});
function httprequest() {
     return new Promise((resolve, reject) => {
        const options = {
            host: 'jsonplaceholder.typicode.com',
            path: '/todos',
            port: 443,
            method: 'GET'
        };
        const req = http.request(options, (res) => {
          if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode));
            }
            var body = [];
            res.on('data', function(chunk) {
                body.push(chunk);
            });
            res.on('end', function() {
                try {
                    body = JSON.parse(Buffer.concat(body).toString());
                } catch(e) {
                    reject(e);
                }
                resolve(body);
            });
        });
        req.on('error', (e) => {
          reject(e.message);
        });
        // send the request
       req.end();
    });
}

1
शेयर करने के लिए धन्यवाद !! यह यूज़ सैंपल था जिसमें बिना कंसोल डेटा का उपयोग किया गया था।
अल्टिएरेस डी माटोस

9

learnyounode से:

var http = require('http')  

http.get(options, function (response) {  
  response.setEncoding('utf8')  
  response.on('data', console.log)  
  response.on('error', console.error)  
})

'विकल्प' मेजबान / पथ चर है


धन्यवाद, एक साधारण उदाहरण के लिए सब कुछ देख रहा था और हर एक ने मुझे आधा दर्जन नई अवधारणाएं दीं। यह सिर्फ यह बताता है कि http.get () अच्छा और सरल कैसे काम करता है। अति उत्कृष्ट!
निक डब्ल्यूडब्ल्यू

6

learnyounode से:

var http = require('http')
var bl = require('bl')

http.get(process.argv[2], function (response) {
    response.pipe(bl(function (err, data) {
        if (err)
            return console.error(err)
        data = data.toString()
        console.log(data)
    }))
})

3

यह मेरा समाधान है, हालांकि यह सुनिश्चित करने के लिए कि आप बहुत सारे मॉड्यूल का उपयोग कर सकते हैं जो आपको एक वादा या समान के रूप में वस्तु देते हैं। वैसे भी, आप एक और कॉलबैक याद कर रहे थे

function getData(callbackData){
  var http = require('http');
  var str = '';

  var options = {
        host: 'www.random.org',
        path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
  };

  callback = function(response) {

        response.on('data', function (chunk) {
              str += chunk;
        });

        response.on('end', function () {
              console.log(str);
          callbackData(str);
        });

        //return str;
  }

  var req = http.request(options, callback).end();

  // These just return undefined and empty
  console.log(req.data);
  console.log(str);
}

कहीं और

getData(function(data){
// YOUR CODE HERE!!!
})

यह कॉलबैकडेटा के रूप में काम नहीं करता है () फ़ंक्शन के रूप में परिभाषित नहीं है?
ह्यूगो कोपामन्स

1

मुझे लगता है कि इस प्रश्न का उत्तर देने में बहुत देर हो चुकी है, लेकिन मुझे उसी समस्या का सामना करना पड़ा है हाल ही में मेरे उपयोग के मामले को पृष्ठांकित JSON एपीआई को कॉल करना और प्रत्येक पेजिंग से सभी डेटा प्राप्त करना और इसे एक ही सरणी में जोड़ना था।

const https = require('https');
const apiUrl = "https://example.com/api/movies/search/?Title=";
let finaldata = [];
let someCallBack = function(data){
  finaldata.push(...data);
  console.log(finaldata);
};
const getData = function (substr, pageNo=1, someCallBack) {

  let actualUrl = apiUrl + `${substr}&page=${pageNo}`;
  let mydata = []
  https.get(actualUrl, (resp) => {
    let data = '';
    resp.on('data', (chunk) => {
        data += chunk;
    });
    resp.on('end', async () => {
        if (JSON.parse(data).total_pages!==null){
          pageNo+=1;
          somCallBack(JSON.parse(data).data);
          await getData(substr, pageNo, someCallBack);
        }
    });
  }).on("error", (err) => {
      console.log("Error: " + err.message);
  });
}

getData("spiderman", pageNo=1, someCallBack);

जैसे @ackuser का उल्लेख है कि हम अन्य मॉड्यूल का उपयोग कर सकते हैं लेकिन मेरे उपयोग के मामले में मुझे नोड का उपयोग करना था https। इसकी उम्मीद करने से दूसरों को मदद मिलेगी।


1
धन्यवाद दोस्त, मैं आप की तरह ही स्थिति में भाग गया, यह बेकार है हम केवल httpshttps अनुरोध जारी करने के लिए उपयोग कर सकते हैं।
केंशिनजी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.