请求在处理readstream事件之前结束

时间:2017-08-30 13:45:28

标签: javascript node.js fs

我正在尝试创建一个nodejs函数,该函数使用以下代码从文件中读取数据:

 app.post('/DownloadData', function(req, res)
 {
   req.on('data', function(data) {
        if (fs.existsSync('demoDataFile.dat')) {
            var rstream = fs.createReadStream('demoDataFile.dat');
            var bufs = [];
            rstream.on('data', function(chunk) {
                bufs.push(chunk);
                console.log("data");
            });
            rstream.on('end', function() {
                downbuf = Buffer.concat(bufs);
                console.log(downbuf.length);
            });
        }
    });
    req.on('end', function() {
        console.log("end length: " + downbuf.length);
        res.end(downbuf);
    });
    req.on('error', function(err)
    {
      console.error(err.stack);
    });
 });

问题是,缓冲区返回为空,因为req.on('end'...在任何rstream.on事件之前调用(“data”并且长度不会在控制台中打印,直到在“结束长度:”被打印之后。我是否处理了错误的事件或是否存在其他问题?我们将不胜感激。

1 个答案:

答案 0 :(得分:-1)

不确定您为什么要从req阅读,因为您根本没有使用身体数据。此外,由于data事件可能会多次触发,因此您用于读取文件的代码也可能被多次调用,这可能不是您想要的。

这就是我认为你想要的东西:

app.post("/DownloadData", function(req, res) {
  let stream = fs.createReadStream("demoDataFile.dat");

  // Handle error regarding to creating/opening the file stream.
  stream.on('error', function(err) {
    console.error(err.stack);
    res.sendStatus(500);
  });

  // Read the file data into memory.
  let bufs = [];
  stream.on("data", function(chunk) {
    bufs.push(chunk);
    console.log("data");
  }).on("end", function() {
    let downbuf = Buffer.concat(bufs);
    console.log(downbuf.length);

    ...process the buffer...

    res.end(downbuf);
  });
});

您必须知道这会将文件完全读入内存。如果它是一个大文件,它可能需要大量内存。

由于您没有指定必须对文件数据执行哪些操作,因此我无法推荐替代方案,但有各种可用的模块可帮助您以流方式处理文件数据(即无需完全将文件读入内存。