如何将csv文件流式传输到节点Web应用程序?

时间:2014-12-30 21:56:45

标签: node.js csv file-upload express stream

我刚开始接受一个新项目。它是一个允许员工输入数据的内部ExpressJS应用程序。有一项功能允许他们输入工资单调整,但页面只允许他们一次输入一个调整并点击提交。他们需要批量上传功能,以便他们可以上传CSV文件并进行数百次调整。

我有这个功能,但我使用文件上传中间件将文件放在临时目录中。我正在读取文件,解析调整项目,并在从服务器删除临时文件之前将调整应用于工资核算数据库。这一切都很好但我真的很讨厌我在进行文件系统I / O以及在解析数据时将文件读入内存。

随着我了解更多关于通过http传输数据的信息,我意识到应该可以将文件流入并解析项目。如果是这样,是否有一个我应该用于此目的的流行模块?将文件流式传输到服务器并即时解析它的最简单方法是什么?

2 个答案:

答案 0 :(得分:4)

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 :(得分: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);
}