Node.js http alma isteğinden nasıl veri alınır?


83

Http alma isteğini döndürmek için işlevimi almaya çalışıyorum, ancak, ne yaparsam yapayım? Kapsamda kayboluyor gibi görünüyor. Node.js'de yeniyim, böylece herhangi bir yardım için minnettarım

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

Yanıtlar:


119

Elbette günlükleriniz geri gelir undefined: istek yapılmadan önce oturum açarsınız. Sorun kapsam değil, eşzamansızlık .

http.requestzaman uyumsuzdur, bu nedenle parametre olarak geri arama alır. Geri aramada yapmanız gerekeni yapın (geçiş yaptığınız kişi 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
Parçaları bir diziye itmenizi ve ardından sonunda join ('') kullanmanızı öneririm. Bu, çok fazla veri varsa sorunları önleyecektir
Eric

Yanıtın HTTP yanıt kodunu nasıl alırım (200 veya 404 vb.)? 'Açık' (response.on), 'veri' ve 'son' anahtar sözcükleriyle ilgili herhangi bir belge var mı? Bunlar anahtar kelimeler mi? Burada hiçbir şey yok gibi görünüyor: nodejs.org/api/http.html#http_class_http_serverresponse
Tyler Durden

@TylerDurden statusCode, yanıt nesnesinin bir özelliğidir. ServerResponseNesne için de uygun dokümantasyonu bulamadım , sadece getve requestmetotları için dokümanlarda örnekler .
Phoca

1
Ancak bu, kodu dağınık hale getirir! JavaScript neden böyle tasarlandı?
Daniel

@Daniel Artık zaman uyumsuz olay modelini işlemek için olanaklar var: Promises ve async / await.
Denys Séguret

16

Http.get kullanarak daha kısa örnek:

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

Bu örnek, alabileceğiniz ve hala koşabileceğiniz kadar kısadır. Bu, iyi bir url ve küçük yanıt olduğunu varsayar. Veri yanıtını parçalayan, yanıt endolayını kullanan ve istek errrorolayını kullanan http örneklerini tercih ederim .
dturvene

2
Sorulan soru göz önüne alındığında, bu cevap bağlam dışındadır. Bunun yanı sıra error event , istek devam ederken bağlantı kesilirse veya iletim sırasında başka sorunlar ortaya çıkarsa , hangisinin tetikleneceğini açıkça dinlemiyorsunuz .
rags2riches

10

Düğüm kullanan Http isteğinin Basit Çalışma Örneği.

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
Paylaşım için teşekkürler !! Bu, console.log kullanmadan dönen verileri içeren benzersiz bir örnekti.
Altieres de Matos

9

Learnyounode'dan:

var http = require('http')  

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

'seçenekler', ana bilgisayar / yol değişkenidir


teşekkürler, her yerde basit bir örnek arıyordum ve bulduğum her biri bana yarım düzine yeni kavram fırlattı. Bu, http.get () işlevinin nasıl güzel ve basit çalıştığını ortaya koydu. Mükemmel!
NickW

6

Learnyounode'dan:

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

Bu benim çözümüm, ancak kesinlikle size nesneyi bir vaat veya benzeri olarak veren birçok modülü kullanabilirsiniz. Her neyse, başka bir geri aramayı kaçırıyordun

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

başka bir yer

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

callbackData () bir işlev olarak tanımlanmadığından bu çalışmıyor gibi görünüyor?
Hugo Koopmans

1

Sanırım bu soruyu cevaplamak için çok geç ama son zamanlarda aynı problemle karşılaştım, benim kullanım durumum sayfalara ayrılmış JSON API'yi çağırmak ve her sayfalandırmadan tüm verileri alıp tek bir diziye eklemek oldu.

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'ın bahsettiği gibi diğer modülü kullanabiliriz ancak benim kullanım durumumda düğümü kullanmak zorunda kaldım https. Bunun başkalarına yardımcı olacağını umuyoruz.


1
Sağol ahbap, senin gibi aynı durumla karşılaştım, berbat bir şey sadece httpshttps talebinde bulunmak için kullanabiliyoruz .
kenshinji
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.