从Node.js保存JSON数据获取对全局变量或文件的请求

时间:2018-05-09 18:43:00

标签: 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) => {
  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 来做这件事,但我又可以将一个请求保存到文件中,但是如果有多个请求我只捕获缓冲区数据。

1 个答案:

答案 0 :(得分:0)

您的问题是在编写文件时发生了request1request2。这是因为节点的异步性质。执行顺序如下所示:

  1. 声明空变量
  2. Request1熄灭
  3. Request2熄灭
  4. 将空变量写入文件
  5. Request1返回并写入变量
  6. Request2回来并写入变量
  7. 解决此问题的一种方法是使用Promises。以下内容允许then中的承诺在Promise.all([ ... ])中的承诺解决后执行:

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

    编辑:

    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')
    ])