2014-12-30 43 views
1

我剛剛在工作中接受了一個新項目。這是一個允許員工輸入數據的內部ExpressJS應用程序。有一項功能允許他們輸入薪資調整,但該頁面只允許他們一次輸入一次調整並點擊提交。他們需要批量上傳功能,以便他們可以上傳包含數百次調整的CSV文件。如何將csv文件流式傳輸到節點網絡應用程序中?

我有功能工作,但我使用的文件上傳中間件將文件放置在臨時目錄中。我正在讀取文件,解析出調整項目,並在從服務器刪除臨時文件之前將調整應用於工資覈算數據庫。這一切都很好,但我真的很討厭我正在做文件系統I/O,以及在解析數據時將文件讀入內存。

當我通過http學習更多關於傳輸數據的知識時,我意識到應該有可能將文件串流化並解析項目。如果是這樣,是否有一個我應該用於此目的的流行模塊?將文件流式傳輸到服務器並在運行中解析它最簡單的方法是什麼?

回答

3

https://www.npmjs.com/package/busboy https://www.npmjs.com/package/fast-csv

var Busboy = require('busboy'); // to handle the form 
var csv = require('fast-csv'); 

function (req, res) { 
    var busboy = new Busboy({ headers: req.headers }); 
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
    file.pipe(csv()) 
     .on('data', function (data) { 
     console.log('YAY, just the data I wanted!', data); 
     }); 
    }); 
    busboy.on('finish', function() { 
    console.log('Done parsing form!'); 
    res.end(); 
    }); 
    req.pipe(busboy); 
} 
+1

正是我一直在尋找。謝謝!並對延遲接受感到抱歉;假期等:) – Chev

+1

請注意,我沒有進行任何錯誤處理。所有的流都有錯誤事件,如果未處理就會拋出。 – generalhenry

1

我知道答案已被接受,但我有痛苦的努力讓答案的代碼正常工作了很多。 到底,什麼工作了,我是這樣,依然採用fast-csvbusboy

var Busboy = require('busboy'); 
var parser = csv(); 

function(req, res) { 
    var busboy = new Busboy({ headers: req.headers }); 
    var result = []; 
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 
     file.on("readable", function() { 
      var data; 
      while ((data = file.read()) !== null) { 
       parser.write(data); 
      } 
     }) 
     .on("end", function() { 
      parser.end(); 
     }); 
    }); 

    parser.on("readable", function() { 
     var data; 
     while ((data = parser.read()) !== null) { 
      //console.log(data); 
      result.push(data); 
     } 
    }) 
    .on("end", function() { 
     console.log("done:",result); 
     res.json(result); 
    }); 

    req.pipe(busboy); 
} 
相關問題