2014-10-03 68 views
9

Tôi cố gắng để thực hiện một mô-đun trong nodejs (chỉ mới bắt đầu làm việc trong nodejs) trong đó có yêu cầu dưới đây nhưnội dung Đọc file csv trong Node.js

  1. Tải lên tệp .csv.
  2. Đọc nội dung của tệp csv.

Các khung hiện đang được sử dụng cho api an toàn là "express": "~ 4.2.0" và multer để tải lên tệp.

Bây giờ tôi đã cấu hình multer như dưới đây trong tôi app.js

app.use(multer({ 
    onFileUploadData : function(file, data){ 
    console.log('onFileUploadData Called with data - '+ data); 
    } 
})); 

Trong tập tin tuyến đường của tôi, tôi có một thiết bị đầu cuối bài như dưới đây

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

tuyến đường này đã được gọi từ cuộc gọi ajax bên dưới là

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

Bây giờ tôi muốn nhận nội dung e của tệp csv, tức là khi tất cả nội dung đã được tải thì tôi sẽ xử lý phương thức chì của tôi là phương thức lead.processCSV.

Ngoài ra, tôi có cần bất kỳ mô-đun nào khác cho tệp csv hoặc trình biên dịch đủ trong trường hợp của tôi không?

Mọi đề xuất/hướng dẫn đúng hướng sẽ hữu ích. Cảm ơn trước.

Trả lời

18

Có một dự án nút tuyệt vời đã giúp tôi rất nhiều. Bạn nên check it out Những gì chúng tôi sẽ sử dụng là mô-đun phân tích cú pháp csv của họ. Nó có thể lấy luồng như đầu vào và đọc nó từng dòng mà không chặn vòng lặp sự kiện, vì vậy về cơ bản trong khi bạn đang xử lý tệp, máy chủ của bạn sẽ không bị kẹt và các yêu cầu khác vẫn có thể được xử lý bình thường.

Vì bạn đã nói bạn chỉ mới bắt đầu với nút, bạn nên thực hiện tìm kiếm nhanh và hiểu cách thức các phần mềm hoạt động trong quá trình xử lý yêu cầu. Để đơn giản hóa việc xử lý yêu cầu, phần mềm trung gian là một hàm (req, res, next). Với req bạn nhận được dữ liệu yêu cầu. Với res bạn có thể gửi phản hồi, và tiếp theo bạn gửi req và res đối tượng của bạn để middleware tiếp theo. Bằng cách này, bạn có thể xử lý yêu cầu trong các bộ phận và phần mềm trung gian cuối cùng của luồng sẽ gửi phản hồi tới máy khách (ví dụ: res.send (200))

gọi hàm Multer ({...}) trả về một hàm trung gian . Khi một yêu cầu đến phần mềm Middleware này, multer sẽ cố gắng tải xuống bất kỳ tệp nào mà người dùng gửi trong yêu cầu đăng bài. Khi u nói app.use (Multer ({...})), bạn đang yêu cầu multer thử và tải xuống các tệp từ bất kỳ yêu cầu bài đăng nào chứa tệp. Đây là một nguy cơ bảo mật nếu không phải tất cả các tuyến đường của bạn đều mong đợi các tệp được tải lên.

Ok, đó đang được nói, đây là một mẫu mã tôi đã viết để xử lý trường hợp sử dụng của bạn:

//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]); 

Tôi hy vọng điều này giúp đỡ. Hãy chắc chắn để hiểu làm thế nào các tuyến đường trung gian làm việc trong nút: họ là một chìa khóa để mã chất lượng tốt.

Marcel

+0

cảm ơn rất nhiều vì câu trả lời này - đã làm việc hoàn hảo – iancrowther

Các vấn đề liên quan