Javascript 将Node.js Get请求中的JSON数据保存到全局变量或文件
我需要将GET请求中的数据保存到变量中,然后将其保存到文件中。但是,在某些情况下,GET请求不会将数据保存到全局变量Javascript 将Node.js Get请求中的JSON数据保存到全局变量或文件,javascript,json,node.js,api,Javascript,Json,Node.js,Api,我需要将GET请求中的数据保存到变量中,然后将其保存到文件中。但是,在某些情况下,GET请求不会将数据保存到全局变量 var fs = require("fs"); var http = require("http"); var request = require('request'); var tmp_json = {}; var g_last = 0; var data = {}; //request 1 http.get('server:api', (resp) => {
var fs = require("fs");
var http = require("http");
var request = require('request');
var tmp_json = {};
var g_last = 0;
var data = {};
//request 1
http.get('server:api', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
tmp_json.server1 = {};
tmp_json.server1 = JSON.parse(data);
g_last = tmp_json.height; // 100500
console.log(g_last); // 100500
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});
//request 2
http.get('server2:api', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
tmp_json.server2 = {};
tmp_json.server2 = JSON.parse(data);
g_last = tmp_json.height; // 256
console.log(g_last); // 256
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});
console.log(g_last); // 0
data = JSON.stringify(tmp_json);
fs.writeFile('data.json', data, 'utf8'); // empty file
此外,我还尝试使用fs.createWriteStream来执行此操作,但我可以将一个请求保存到文件,但如果有多个请求,我只捕获缓冲区数据。您的问题是,在编写文件时,
request1
和request2
正在发生。这是因为节点的异步性质。执行顺序如下所示:
Promise中的承诺之后执行中的函数。所有([…])
都已解决:
var fs = require("fs");
var http = require("http");
var tmp_json = {};
var g_last = 0;
var data = {};
//request 1
var req1 = new Promise((resolve, reject) => {
http.get('server:api', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
tmp_json.server1 = {};
tmp_json.server1 = JSON.parse(data);
g_last = tmp_json.height; // 100500
console.log(g_last); // 100500
resolve()
});
}).on("error", (err) => {
console.log("Error: " + err.message);
reject(error)
});
});
//request 2
var req2 = new Promise((resolve, reject) => {
http.get('server2:api', (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
tmp_json.server2 = {};
tmp_json.server2 = JSON.parse(data);
g_last = tmp_json.height; // 256
console.log(g_last); // 256
resolve()
});
}).on("error", (err) => {
console.log("Error: " + err.message);
reject(error)
});
});
Promise.all([ req1, req2 ]).then(() => {
console.log(g_last);
data = JSON.stringify(tmp_json);
fs.writeFile('data.json', data, 'utf8');
})
编辑:
我不认为您尝试的是可能的,因为这些请求本质上是异步的。请记住,异步代码的运行是不同步的,也就是说,我在函数2之前调用函数1并不一定意味着函数1将在函数2之前解析。谢谢,这是一项了不起的工作!但是我可以像调用带参数的函数一样调用它吗。例如,如果我需要将服务器的url地址设置为参数?@MAxShvedov您可以编写一个返回承诺的函数,我将在我的答案中添加一个示例。节点告诉我:unhandledPromisejectionWarning:unhandledPromisejection拒绝(拒绝id:1):TypeError:http.get不是函数
function handleGet (url) {
return new Promise((resolve, reject) => {
http.get(url, (resp) => {
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
resp.on('end', () => {
tmp_json.server1 = {};
tmp_json.server1 = JSON.parse(data);
g_last = tmp_json.height; // 100500
console.log(g_last); // 100500
resolve()
});
}).on("error", (err) => {
console.log("Error: " + err.message);
reject(error)
});
})
}
// Then use it
Promise.all([
handleGet('http://google.ca'),
handleGet('http://somesite.com')
])