node.js - 在 node.js 中读取 csv 文件的内容

标签 node.js csv express multer

我正在尝试在 nodejs 中实现一个模块(刚开始在 nodejs 中工作),它的要求如下

  1. 上传 .csv 文件。
  2. 读取 csv 文件的内容。

目前用于restful api的框架是“express”:“~4.2.0”和multer用于文件上传。

现在我在 app.js

中配置了 multer,如下所示
app.use(multer({
  onFileUploadData : function(file, data){
    console.log('onFileUploadData Called with data - '+ data);
  }
}));

在我的路由文件中,我有一个如下所示的 post 端点

app.post('/sample.csv',lead.processCSV);

这条路线是从下面的 ajax 调用中调用的

$.ajax({
            xhrFields: {withCredentials: true},
            url: '/sample.csv',
            type: 'POST',
            success: function (data) {
                $scope.handleResponse(data);
            },
            error: function (error, xhr) {
                angular.element('#csvUploadBusyIcon').hide();
                alert('Oops! Upload failed');
            },
            data: formData,
            cache: false,
            contentType: false,
            processData: false
        });

现在我想获取 csv 文件的内容,即当所有内容都已加载后,我应该处理我的 lead.processCSV 方法。

我还需要任何其他用于 csv 文件的模块,或者 multer 在我的情况下就足够了吗?

任何正确方向的建议/指导都会有所帮助。提前致谢。

最佳答案

有一个很棒的 Node 项目对我帮助很大。你应该 check it out 我们要使用的是他们的 csv-parse 模块。它能够获取一个流作为输入并逐行读取它而不会阻塞事件循环,因此基本上在您处理文件时您的服务器不会卡住,其他请求仍然可以正常处理。

既然你说你只是从 nodejs 开始,你应该快速搜索并了解中间件在请求处理过程中是如何工作的。 作为请求处理的简化,中间件是一个函数(req, res, next)。使用 req 您可以获得请求数据。使用 res 您可以发送响应,然后将您的 req 和 res 对象发送到下一个中​​间件。这样您就可以分部分处理请求,并且流的最后一个中间件将向客户端发送响应(例如 res.send(200))

Multer({...}) 调用返回一个中间件函数。当请求到达此中间件时,multer 将尝试下载用户在发布请求中发送的任何文件。当您说 app.use(Multer({...})) 时,您是在要求 multer 尝试从任何包含文件的发布请求中下载文件。如果不是所有路由都需要上传文件,这会带来安全风险。

好的,话虽如此,这是我为处理您的用例而编写的示例代码:

//Important Security advice: 
//don't add multer as a middleware to all requests. 
//If you do this, people will be able to upload files
//in ALL YOUR 'post' handlers!!! 

var Multer = require('multer');
var Parse = require('csv-parse');
var fs = require('fs')

function parseCSVFile(sourceFilePath, columns, onNewRecord, handleError, done){
    var source = fs.createReadStream(sourceFilePath);

    var linesRead = 0;

    var parser = Parse({
        delimiter: ',', 
        columns:columns
    });

    parser.on("readable", function(){
        var record;
        while (record = parser.read()) {
            linesRead++;
            onNewRecord(record);
        }
    });

    parser.on("error", function(error){
        handleError(error)
    });

    parser.on("end", function(){
        done(linesRead);
    });

    source.pipe(parser);
}

//We will call this once Multer's middleware processed the request
//and stored file in req.files.fileFormFieldName

function parseFile(req, res, next){
    var filePath = req.files.file.path;
    console.log(filePath);
    function onNewRecord(record){
        console.log(record)
    }

    function onError(error){
        console.log(error)
    }

    function done(linesRead){
        res.send(200, linesRead)
    }

    var columns = true; 
    parseCSVFile(filePath, columns, onNewRecord, onError, done);

}

//this is the route handler with two middlewares. 
//First:  Multer middleware to download file. At some point,
//this middleware calls next() so process continues on to next middleware
//Second: use the file as you need

app.post('/upload', [Multer({dest:'./uploads'}), parseFile]);

我希望这会有所帮助。确保了解路由中间件在 Node 中的工作方式:它们是高质量代码的关键。

马塞尔

关于node.js - 在 node.js 中读取 csv 文件的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26174289/

相关文章:

javascript - 我需要连接我的数据库然后将其显示在网页上

node.js - 如何组织我的 yarn 包

node.js - NodeJS使用相对路径访问文件

javascript - 使用 app.post 和 req.body 获取 undefined

php - 上传 CSV 文件并导入 mysql 时出现错误

javascript - 如何将分层 csv(分号分隔)转换为多维数组

java - 用Java读取和破坏CSV文件:

javascript - Nock 不拦截 http 请求

javascript - 使用 Crypto Node.js 获取错误 "data too large for key size"

javascript - 如何使用selenium点击由javascript生成的元素