使用Node js从链接下载json文件

时间:2017-05-23 19:13:40

标签: javascript node.js

我需要用Node JS编写一个应用程序,它给出一个json文件的链接,例如http://data.phishtank.com/data/online-valid.json(链接不打开它打开下载的文件),程序只需下载对象然后打印出来。怎么能实现这一目标?这就是我到目前为止所做的事情似乎并没有起作用:

var checkIfPhishing = function(urlToPrint){
    var http = require('http');
    var fs = require('fs');

    var file = fs.createWriteStream("SiteObject.json");
    var request = http.get(urlToPrint, function(response) {
    response.pipe(file);});

    var siteObj= fs.readFileSync("SiteObject.json");

    console.log(siteObj);

};

谢谢!

1 个答案:

答案 0 :(得分:3)

您不能混淆异步和同步读写。 在您的情况下,您开始将数据从其他服务器流式传输到您的服务器,但之后您已经开始 sync 读取。 Wich会阻塞线程,所以在读完0字节文件之后将处理流...

因此,您需要先将流存储在变量中,然后在完成日志中存储该流。

所以,简单地这样做:

var data="";
var request = http.get(urlToPrint, function(response) {
response.on("data",append=>data+=append).on("finish",()=>console.log(data));;
});

如果流完成对该字符串的记录,则将流的异步提供的块存储在变量中。

如果您也想存储它:

var http = require('http');
var fs = require('fs');
function checkIfPhishing(urlToPrint){
    var file = fs.createWriteStream("SiteObject.json");
    var request = http.get(urlToPrint, function(response) {
      response.on("finish",function(){
        console.log( fs.readFileSync("SiteObject.json",{encoding:"utf8"}));
      }).pipe(file);
    });
}

这与您的代码完全相同,但它在同步读取之前等待流完成...

但是请注意,同步读取会减慢整个过程,因此您可以直接流式传输到控制台/浏览器..