【问题标题】:Request ends before readstream events are handled请求在处理 readstream 事件之前结束
【发布时间】:2017-08-31 01:35:23
【问题描述】:

我正在尝试创建一个 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" 并且长度不会在控制台中打印,直到在打印“结束长度:”之后)。我处理事件是否错误或是否有其他问题?任何指导将不胜感激。

【问题讨论】:

  • 什么是req?还有其他代码对req 做任何事情吗?
  • 对不起,我会修改上面的代码sn-p
  • 我删除了 sn-p 的原因是:片段用于 可运行-in-browser 代码。我要再次删除它。只需将代码块用于代码块。
  • 既然您使用的是 Express,您是否有理由不使用 res.sendFile()
  • 这不是问题,但我很好奇你为什么要等到从请求中获得data 事件才开始读取,因为你没有将数据用于任何事情。 ..还要注意fs.readFile的存在。最后,在打开之前检查是否存在是一种反模式:只需打开,并对“未找到”错误做出反应。 (所有这些都与问题无关。)

标签: javascript node.js fs


【解决方案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);
  });
});

您必须注意,这会将文件完全读入内存。如果是大文件,可能需要大量内存。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多