我正在尝试创建一个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”并且长度不会在控制台中打印,直到在“结束长度:”被打印之后。我是否处理了错误的事件或是否存在其他问题?我们将不胜感激。
答案 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);
});
});
您必须知道这会将文件完全读入内存。如果它是一个大文件,它可能需要大量内存。
由于您没有指定必须对文件数据执行哪些操作,因此我无法推荐替代方案,但有各种可用的模块可帮助您以流方式处理文件数据(即无需完全将文件读入内存。