我需要用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);
};
谢谢!
答案 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);
});
}
这与您的代码完全相同,但它在同步读取之前等待流完成...
但是请注意,同步读取会减慢整个过程,因此您可以直接流式传输到控制台/浏览器..