2017-09-25 21 views
0

Je lis le fichier JSON en utilisant fs.readFileSync et pour chaque document obtenu, je fais un appel d'API de repos en utilisant le client .poster. Une fois que j'obtiens une réponse, je veux placer le contenu reçu dans un autre fichier JSON qui est une réplique de l'entrée JSON à l'exception de l'élément supplémentaire qui est la donnée reçue de l'appel client.post. Cependant probablement en raison de la nature asynchrone de client.post, je suis incapable d'ajouter l'élément à la sortie JSON. Je suis nouveau à NodeJS. Pouvez-vous s'il vous plaît m'aider là où je suis manquant. Ci-dessous le code et les donnéesNodeJS Lire le fichier, faire l'appel node-rest-client pour obtenir des données connexes et ajouter la réponse récupérée comme élément dans JSON

données:

[ 
    { 
     "ticker": "CLYD" 
    }, 
    { 
     "ticker": "EGH" 
    } 
] 

code:

var fs = require('fs'); 
var Client = require('node-rest-client').Client; 

var data = fs.readFileSync(__dirname + "/data/stocks.json", "utf8"); 
processData(data); 

function processData (data) { 

    var obj = JSON.parse(data); 

    for (j = 0; j < obj.length; j++) { 

     obj[j].stockInformation = getValuesForTicker (obj[j].ticker.trim()); 

    } 

    var jsonOutput = JSON.stringify(obj,null,'\t'); 
    fs.writeFileSync(__dirname + "/data/response.json", jsonOutput); 

}; 

function getValuesForTicker (ticker) { 

    /** 
    * More details and samples at https://www.npmjs.com/package/node-rest-client 
    */ 
    var client = new Client(); 
    var values; 

    // set content-type header and data as json in args parameter 
    var args = { 
     data: { "ticker" : ticker}, 
     headers: { "Content-Type": "application/json", "Accept" : "application/json" } 
    }; 

    var responseToRequest = client.post("https://url.providing.response.as.json.content/", args, function (data, response) { 
//   parsed response body as js object 
     values = JSON.parse(JSON.stringify(data)).price; 
    }); 
    return values; 

}; 

Répondre

0

Depuis getValueForTicker fait un appel asynchrone pour récupérer les données qu'il doit appeler un rappel une fois les données est reçu (ou mieux une promesse) et ne renvoie pas le résultat (actuellement undefined est retourné que la valeur est renvoyée avant que la valeur est affectée)

function getValuesForTicker (ticker, callback) { 

    /** 
    * More details and samples at https://www.npmjs.com/package/node-rest-client 
    */ 
    return new Promise(function(resolve, reject) { 

      var client = new Client(); 
      var values; 

      // set content-type header and data as json in args parameter 
      var args = { 
       data: { "ticker" : ticker}, 
       headers: { "Content-Type": "application/json", "Accept" : "application/json" } 
      }; 

      var responseToRequest = 
      client.post("https://url.providing.response.as.json.content/", args, function (data, response) { 
     //   parsed response body as js object 
      values = JSON.parse(JSON.stringify(data)).price; 
      resolve(values) 
     }); 

    }; 
}) 

et pour obtenir les données une fois appel asynchrone est fait, vous aurez besoin d'appeler la fonction puis comme ci-dessous:

 getValuesForTicker(obj[j].ticker.trim()) 
     .then(function(val) { 
      obj[j].stockInformation = val 
     }) 

Envisagez-vous débutez à Node.js, il sera difficile de get.Take un certain temps pour comprendre rappel et promesse d'abord.

+0

Merci Minkesh. J'ai essayé le code que vous avez donné mais je n'ai pas pu utiliser la partie 'obj [j] .stockInformation = val' du code. Je pense que pour un appel asynchrone, obj [j] sort du cadre. J'essaie de trouver un moyen de définir des valeurs de retour à obj [j] – user1998463

+0

En fait, la boucle for n'attend pas la promesse de résoudre (ou dans un autre mot, appel asynchrone à terminer). Vous pouvez utiliser la bibliothèque 'async' pour obtenir les résultats souhaités. https://github.com/caolan/async. Plus précisément, vous devrez utiliser la méthode 'async.each'. Vous pouvez également y parvenir en utilisant 'Promise.all'. –