node.js fs.createWriteStream中的一些问题

时间:2017-10-03 01:19:48

标签: node.js fs

这段代码似乎表现不错,但是当我尝试读取最后一行中的文件(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');

1 个答案:

答案 0 :(得分:0)

您正在尝试在编写文件之前阅读该文件。您正在写入的writeStream是异步的。这意味着它将来完成一些不确定的时间。同时,其余代码继续运行,因此您尝试在文件完成之前读取它。

在您拥有的代码中,这里是事件的顺序。

  1. 创建writeStream
  2. 发起http request()
  3. 使用request()将来自.pipe()的未来数据隐藏到您的信息流中。
  4. 在流上注册finish事件处理程序。
  5. 致电fs.readFileSync()阅读文件
  6. 数据从request()到达,并被发送到可以缓冲的写入流。
  7. 更多数据从request()到达,并被发送到可以缓冲它的写入流。
  8. 请求完成,告诉writeStream将其数据刷新到磁盘并自行关闭。
  9. 发生finish事件。
  10. 您注册了close事件处理程序。
  11. 发生close事件。
  12. 您可以使用流通知来执行您想要的操作,但只是测试文件,您可以将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事件处理程序。

    在这个新建议的代码中,这里是事件序列:

    1. 创建writeStream
    2. 发起http request()
    3. 使用request()将来自.pipe()的未来数据隐藏到您的信息流中。
    4. 在流上注册finish事件处理程序。
    5. 注册close事件处理程序。
    6. 数据从request()到达,并被发送到可以缓冲的写入流。
    7. 更多数据从request()到达,并被发送到可以缓冲它的写入流。
    8. 请求完成,告诉writeStream将其数据刷新到磁盘并自行关闭。
    9. 发生finish事件。
    10. 发生close事件。
    11. 致电fs.readFileSync()阅读文件