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, получить его будет сложно. Потратьте некоторое время, чтобы понять обратный вызов и сначала пообещать.