你如何streamcsv文件到节点的networking应用程序?

我刚刚在工作中接受了一个新项目。 这是一个内部ExpressJS应用程序,允许员工input数据。 有一个function,允许他们进入工资调整,但页面只允许他们一次input一个单一的调整,并提交。 他们需要批量上传function,以便他们可以上传包含数百个可能的调整的CSV文件。

我有function工作,但我正在使用的file upload中间件将文件放在一个临时目录。 我正在读取文件,parsing出调整项目,并将调整应用到工资核算数据库,然后从服务器中删除临时文件。 这一切都很好,但我真的很讨厌我正在做文件系统I / O,以及在parsing数据时将文件读入内存。

当我通过http学习更多关于传输数据的知识时,我意识到应该有可能将文件串stream并parsing这些项​​目。 如果是这样的话,我应该使用一个stream行的模块来达到这个目的吗? 什么是最简单的方法来将文件stream式传输到服务器并在运行中parsing它?

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

我知道答案已经被接受,但是我有很多的努力使答案的代码正常工作。 最后,对我来说是这样的,仍然使用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); }