Node.js http get 요청에서 데이터를 가져 오는 방법


82

http get 요청을 반환하는 내 함수를 얻으려고 노력하고 있지만 무엇을하든? 범위에서 잃어버린 것처럼 보입니다. 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);
}

답변:


118

물론 로그 반환 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
청크를 배열에 넣은 다음 끝에 join ( '')을 사용하는 것이 좋습니다. 많은 양의 데이터가 있으면 그 문제를 피할 것
에릭

응답의 HTTP 응답 코드 (200 또는 404 등)는 어떻게 얻습니까? 키워드 'on'(response.on), 'data'및 'end'에 대한 문서가 있습니까? 이 키워드입니까? 여기에 아무것도없는 것 같습니다 : nodejs.org/api/http.html#http_class_http_serverresponse
Tyler Durden

@TylerDurden statusCode은 응답 개체의 속성입니다. ServerResponse개체에 대한 적절한 문서를 찾을 수 없었 으며 getrequest메서드 에 대한 문서의 예제 만 찾을 수있었습니다 .
Phoca

1
그러나 이것은 코드를 지저분하게 만듭니다! 자바 스크립트가 이렇게 디자인 된 이유는 무엇입니까?
Daniel

@Daniel 이제 비동기 이벤트 모델을 처리 할 수있는 기능이 있습니다 : 약속 및 비동기 / 대기.
Denys Séguret

15

http.get을 사용한 짧은 예 :

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

이 예제는 얻을 수 있고 실행할 수있는 한 짧습니다. 이것은 좋은 URL과 작은 응답을 가정합니다. 데이터 응답을 청크하고 응답 end이벤트를 사용하고 요청 errror이벤트를 사용 하는 http 예제를 선호합니다 .
dturvene

2
이 답변은 질문이 주어진 상황에서 벗어났습니다. 그 외에도 error event 요청이 진행중인 동안 연결이 끊어 지거나 전송 중에 다른 문제가 발생하면 트리거되는에 대해 명시 적으로 수신하지 않습니다 .
rags2riches

9

learnyounode에서 :

var http = require('http')  

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

'options'는 호스트 / 경로 변수입니다.


감사합니다. 간단한 예를 찾아 보았고 제가 찾은 모든 사람들이 6 개의 새로운 개념을 저에게 던졌습니다. 이것은 http.get ()이 멋지고 간단하게 작동하는 방법을 설명했습니다. 우수한!
NickW

9

노드를 이용한 Http 요청의 간단한 작업 예.

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
공유해 주셔서 감사합니다 !! 이것은 console.log를 사용하지 않고 데이터를 반환하는 고유 한 샘플입니다.
Altieres de Matos

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

callbackData ()가 함수로 정의되지 않았기 때문에 작동하지 않는 것 같습니다.
Hugo Koopmans

1

이 질문에 답하기에는 너무 늦었다 고 생각하지만 최근에 동일한 문제에 직면했습니다. 내 사용 사례는 페이지 매김 JSON API를 호출하고 각 페이지 매김에서 모든 데이터를 가져와 단일 배열에 추가하는 것이 었습니다.

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 요청을 발행하는 데 에만 사용할 수 있습니다 .
kenshinji
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.