Javascript 使用节点js从链接下载json文件

Javascript 使用节点js从链接下载json文件,javascript,node.js,Javascript,Node.js,我需要用Node JS编写一个应用程序,它提供了一个指向json文件的链接。例如,链接没有打开文件,而是打开下载,程序只是下载对象,然后打印出来。如何做到这一点?到目前为止,这就是我所拥有的,但它似乎不起作用: var checkIfPhishing = function(urlToPrint){ var http = require('http'); var fs = require('fs'); var file = fs.createWriteStream("Si

我需要用Node JS编写一个应用程序,它提供了一个指向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);

};

谢谢大家!

不能混合使用异步和同步读写。 在您的情况下,您开始将数据从另一台服务器流式传输到您的服务器,但随后您已经开始同步读取。Wich将阻止线程,以便在读取0字节文件后处理流

因此,您需要先将流存储在变量中,然后在finish日志中记录该流

所以简单地做这样的事情:

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);
    });
}
这与您的代码完全相同,但它会等待流完成,然后再同步读取


但是请注意,同步读取会降低整个过程的速度,因此您可能会直接将数据流传输到控制台/浏览器。

您不能将异步和同步读取和写入混为一谈。 在您的情况下,您开始将数据从另一台服务器流式传输到您的服务器,但随后您已经开始同步读取。Wich将阻止线程,以便在读取0字节文件后处理流

因此,您需要先将流存储在变量中,然后在finish日志中记录该流

所以简单地做这样的事情:

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);
    });
}
这与您的代码完全相同,但它会等待流完成,然后再同步读取


但是请注意,同步读取会降低整个过程的速度,因此您可能会直接将数据流传输到控制台/a浏览器。

首先将requires从函数中删除。这将使您的性能加倍…首先,将需求从功能中排除。这将使您的性能加倍…谢谢,但是如果我想先保存json对象,然后再打印它呢?您能解释一下您的答案和我为下载文件而编写的代码之间的区别吗?@Nivolas有效吗?无论如何改进了我的描述问题出在console.log fs.readFileSyncSiteObject.json行上正确的行应该是console.log json.parsefs.readFileSyncSiteObject。json@Nivolas好啊也许是因为它是一个缓冲区?因此,我可以指定编码请参见再次编辑谢谢,但是如果我想先保存json对象,然后再打印它,该怎么办?请您解释一下您的答案和我为下载该文件而编写的代码之间的区别吗?@Nivolas它行得通吗?无论如何改进了我的描述问题出在console.log fs.readFileSyncSiteObject.json行上正确的行应该是console.log json.parsefs.readFileSyncSiteObject。json@Nivolas好啊也许是因为它是一个缓冲区?因此,可以指定编码,请参见再次编辑