这段代码似乎表现不错,但是当我尝试读取最后一行中的文件(someFile.json)时根本不起作用。 :-(请一些线索。虽然我知道问题很复杂。
var fs = require('fs');
var request = require("request")
var dataFile = 'data/someFile.json'
var url = "https://api.someUrl"
var file = fs.createWriteStream(dataFile);
request(url).pipe(file);
file.on('finish',function(){
console.log('file download to ',dataFile)
file.destroy();
//file.closeSync;
file.on('close', function(){ console.log('File Closed ')})
})
var datos = fs.readFileSync(dataFile, 'utf8');
答案 0 :(得分:0)
您正在尝试在编写文件之前阅读该文件。您正在写入的writeStream是异步的。这意味着它将来完成一些不确定的时间。同时,其余代码继续运行,因此您尝试在文件完成之前读取它。
在您拥有的代码中,这里是事件的顺序。
request()
request()
将来自.pipe()
的未来数据隐藏到您的信息流中。finish
事件处理程序。fs.readFileSync()
阅读文件request()
到达,并被发送到可以缓冲的写入流。request()
到达,并被发送到可以缓冲它的写入流。finish
事件。close
事件处理程序。close
事件。您可以使用流通知来执行您想要的操作,但只是测试文件,您可以将fs.readFileSync()
放在写入流上的close事件的完成句柄中。
const fs = require('fs');
const request = require("request")
const dataFile = 'data/someFile.json'
const url = "https://api.someUrl"
const file = fs.createWriteStream(dataFile);
request(url).pipe(file);
file.on('finish',function(){
console.log('file download to ',dataFile)
}).on('close', function(){
console.log('File Closed ');
// file is available for reading now
var datos = fs.readFileSync(dataFile, 'utf8');
console.log(datos);
});
此外,您不需要.destroy()
流。默认情况下,它将设置为autoClose
,当您传送到它的流完成后,它将自动关闭。并且,您不希望.on('close', ...)
错误处理程序中包含finish
事件处理程序。
在这个新建议的代码中,这里是事件序列:
request()
request()
将来自.pipe()
的未来数据隐藏到您的信息流中。finish
事件处理程序。close
事件处理程序。request()
到达,并被发送到可以缓冲的写入流。request()
到达,并被发送到可以缓冲它的写入流。finish
事件。close
事件。fs.readFileSync()
阅读文件