2017-08-30 53 views
0

我试图做一个功能的NodeJS从文件中读取数据回用下面的代码:请求结束readstream事件的处理之前

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事件之前调用(“数据”和长度不会在控制台中打印,直到打印完“length length:”后)。事件不对或有其他问题吗?任何指导将不胜感激

+0

什么是'req'?有没有其他的代码用'req'做任何事情? –

+0

对不起,我会修改上面的代码片段 –

+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); 
    }); 
}); 

你必须要注意,这将文件读入到内存完全。如果它是一个大文件,它可能需要大量的内存。由于您没有指定必须对文件数据执行哪些操作,因此我不能推荐替代方案,但有各种可用的模块可帮助您以流方式处理文件数据(即不需要将文件完全读入内存)。

相关问题