2017-10-28 10 views
0

Neuling hier. Ich versuche, Daten aus verschiedenen Quellen http zu holen, aber ich war nicht in der Lage den asynchronen Modus sogar mit „async“ zu handhaben ...Knoten js mehrere http asynchrone Anfrage

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... 

Was soll ich tun, um das Ergebnis in meinen Array schieben? Ich konnte keine Möglichkeit finden, eine funktionierende Callback-Funktion einzurichten, um Ergebnisse in das Array zu übertragen.

Es tut uns leid, es ist eine sehr grundlegende Frage in Node.js. Ich hoffe, es ist nicht zu redundant.

Vielen Dank für Ihre Hilfe

Antwort

1

Da Sie bereits die request Paket verwenden, haben Sie etwas so einfach wie versucht:

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

stattdessen Ihre eigenen getJson Funktion des Schreibens?

0

Danke Roby, Ihre Anfrage ist viel klarer!

Ich habe sorgfältig lesen Sie diese wirklich klar und hilfreich Artikel: https://github.com/maxogden/art-of-node#callbacks

Ich denke, dass ich die Logik bekam:

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

Danke für die Hilfe