2017-10-28 3 views
0

여기 새내기. ... 나는 다른 HTTP 소스에서 데이터를 가져 오기 위해 노력하지만 난 "비동기"와 비동기 모드를 처리 할 수 ​​없습니다노드 js 다중 http 비동기 요청

var express = require('express'); 
var app = express(); 
var https = require("https"); 
var timer = require("./my_modules/timer/timer.js"); 
var http = require('http'); 
var bodyParser = require('body-parser'); 
var async = require('async'); 
var request = require('request'); 

//These are my source from API. 
//Output is a Json file 
var sources = { 
    cnn: 'https://newsapi.org/v1/articles?source=cnn&sortBy?&apiKey=c6b3fe2e86d54cae8dcb10dc77d5c5fc', 
    bbc: 'https://newsapi.org/v1/articles?source=cnn&sortBy?&apiKey=c6b3fe2e86d54cae8dcb10dc77d5c5fc', 
    guardian: 'https://newsapi.org/v1/articles?source=cnn&sortBy?&apiKey=c6b3fe2e86d54cae8dcb10dc77d5c5fc', 
    othersource: "otherurls..." 
}; 

//I want to push the JSON object in this array 
var resultArray = []; 

//I setup a https GET request 
var getJson = function(url) { 
    https.get(url, (res) => { 
    var body = ''; 
    res.on('data', function(chunk) { 
     body += chunk; 
    }); 

    res.on('end', function() { 
     result = JSON.parse(body); 

     //push isn't working... 
     resultArray.push(result); 
    }); 

    }).on('error', function(e) { 
    console.log('Got an error', e); 
    }); 
} 

app.set('port', (process.env.PORT || 5000)); 
app.listen(
    app.get('port'),() => { 
    console.log('We are live on port: ', app.get('port')); 
    getJson(sources.cnn); 
    }); 


app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
app.use(bodyParser.json()); 
app.use(function(req, res, next) { 
    res.setHeader('Content-Type', 'text/plain'); 
    res.status(404).send('Page not found !'); 
    res.status(503).send('Page not found, error 503'); 
}); 

console.log("resultArray:" + resultArray); 
//resultArray = empty... 

내 배열로 결과를 밀어 어떻게해야합니까? 작업 콜백 함수를 설정하여 결과를 배열에 푸시 할 수있는 방법을 찾지 못했습니다.

죄송합니다. Node.js에서 매우 기본적인 질문입니다. 너무 과도하지 않기를 바랍니다. 대신 자신의 getJson 함수를 작성의

request({ 
    url: sources.cnn, 
    json: true 
}, function(error, response, body) { 
    var articles = body.articles; 

    // or by case, depending on what you want 
    // resultArray = resultArray.concat(articles); 
    resultArray.push({ 
     cnn: articles 
    }); 

    console.log(resultArray); 
}); 

:

답변

1

이미 request 패키지를 사용하고 있기 때문에 당신의 도움에 대한

많은 감사합니다, 당신은 같은 간단한 시도가?

0

감사합니다. Roby 님, 귀하의 요청이 훨씬 명확합니다!

I가주의 깊게 정말 명확하고 도움이 기사 읽기 : 나는 논리 것 같아 https://github.com/maxogden/art-of-node#callbacks

을 : 도움을

//main function 
function getJson(url, callback){ 
    request({ 
     url: url, 
     json: true, 
     callback:callback //added this 
     }, function(error, response, body) { 

      var articles = body.articles; 
      callback(articles); 
     }); 
} 

//this callback function will be passed to the main function as the 2nd parameter 
//it's possible to access "resultArray" ONLY from this function 
var result = function(e){ 
    resultArray.push(e); 
    console.log(resultArray); 
    }; 

//url and callback are passed as parameter 
getJson(sources.cnn, result); 

감사를