NodeJS Чтение файла, вызов узла-отдыха-клиента для получения связанных данных и добавление полученного ответа в качестве элемента в JSON.

Я читаю JSON-файл, используя fs.readFileSync, и для каждого полученного документа я делаю вызов API покоя, используя client.post. Получив ответ, я хочу поместить полученный контент в другой файл JSON, который является копией входного JSON, за исключением дополнительного элемента, который представляет собой данные, полученные из вызова client.post. Однако, вероятно, из-за асинхронной природы client.post я не могу добавить элемент в вывод JSON. Я новичок в NodeJS. Можете ли вы помочь мне, где я скучаю. Ниже приведен код и данные

данные:

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

Код:

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;

};

1 ответ

Поскольку getValueForTicker делает асинхронный вызов для получения данных, он должен вызывать обратный вызов после получения данных (или, лучше, обещание) и не возвращать результат (в настоящее время undefined возвращается как значение, возвращаемое до присвоения значения)

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

    };
})

и чтобы получить данные после выполнения асинхронного вызова, вам нужно будет вызвать функцию, как показано ниже:

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

Учитывая, что вы новичок в node.js, получить его будет сложно. Потратьте некоторое время, чтобы понять обратный вызов и сначала пообещать.

Другие вопросы по тегам