2017-08-30 50 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); 
    }); 
}); 

你必須要注意,這將文件讀入到內存完全。如果它是一個大文件,它可能需要大量的內存。由於您沒有指定必須對文件數據執行哪些操作,因此我不能推薦替代方案,但有各種可用的模塊可幫助您以流方式處理文件數據(即不需要將文件完全讀入內存)。

相關問題