2013-08-19 29 views
13

Hey Tôi đang cố gắng xuất csv từ node.js (kéo dữ liệu từ mongodb). Tôi đã có dữ liệu được kéo và phân cách bằng dấu phẩy và tất cả, nhưng bây giờ tôi đang cố gắng tìm ra cách để thực sự gửi nó ... Tôi đang gắn mã này vào tập tin tuyến đường của tôi. Bất kỳ lời khuyên nào về cách lấy mảng dữ liệu và gửi cho người dùng trực tiếp để tải xuống theo yêu cầu.Cách xuất csv nodejs

đây là đoạn code: (Tôi đã cố gắng trong phần dưới cùng của mã chức năng thứ hai)

exports.downloadContacts = function(req, res) { 
    async.waterfall([ 
     function(callback) { 
      var source = []; 
      Friend.find({userId: req.signedCookies.userid}, function(err, friends) { 
       if(err) {console.log('err with friends for download'); 
       } else { 
        var userMap = {}; 
        var friendIds = friends.map(function (user) { 
         userMap[user.friend_id] = user; 
         return user.friend_id; 
        }); 
        console.log(friends); 
        User.find({_id: {$in: friendIds}}, function(err, users) { 
         if(err) {console.log(err); 
         } else { 
          for(var i = 0; i < users.length; i++) { 
           console.log('users') 
           //console.log(users[i]); 
           source.push(users[i].firstNameTrue, users[i].lastNameTrue, users[i].emailTrue, users[i].phone, users[i].emailList, users[i].phoneList) 
          } 
          console.log(source); 
          callback(null, source); 
         } 


        }); 
       } 


      }); 

     } 
    ], 
    function(err, source) { 
     var result = []; 

     res.contentType('csv'); 

     csv() 
     .from(source) 
     .on('data', function(data){ 
      result.push(data.join()); 
     }) 
     .on('end', function(){ 
      res.send(result.join('\n')); 
     }); 
    });  
}; 

Trả lời

19

Bạn đã thử một cái gì đó như thế này với một kiểu nội dung như "application/octet-stream"

res.set('Content-Type', 'application/octet-stream'); 
res.send(<your data>); 

hoặc đơn giản là

res.send(new Buffer(<your data>)); 

Express send() docs.

+0

Vâng, nó hoạt động, nhưng làm cách nào để đặt đúng kiểu nội dung ... là giả sử để hiển thị dưới dạng tệp - tệp trong thư mục tải xuống của tôi? hoặc là có một cách thân thiện hơn để gửi nó? Điều này làm việc tốt và mở ra với bất kỳ ứng dụng, nhưng chỉ tự hỏi nếu có một cách tốt hơn để thiết lập loại hoặc làm thế nào để làm cho nó trông đẹp hơn, hoặc đây là cách mọi người làm điều đó nếu bạn đang cố gắng để gửi một tập tin? – Lion789

+0

Bạn có ý nghĩa gì khi "đẹp hơn"? có thể là "text/plain"? Bạn có thể cho tôi biết thêm một chút thông tin về những gì bạn đang cố gắng làm. Chúc mừng. –

+0

Về cơ bản, cố gắng cho phép người dùng tải xuống danh sách liên hệ của họ ngoại tuyến ... – Lion789

2

Tôi không hoàn toàn chắc chắn những gì bạn câu hỏi là, nhưng tôi nghĩ rằng những gì bạn đang tìm kiếm có thể được giải quyết bằng cách thiết lập tiêu đề Xử lý nội dung. Hãy xem câu trả lời này trên một câu hỏi SO khác: https://stackoverflow.com/a/7288883/2320243.

+0

Tôi đang cố gắng gửi danh sách bạn bè của người dùng ngoại tuyến, cho phép họ tải xuống danh sách bạn bè dưới dạng csv được tạo từ mongodb và được gửi trực tiếp tới người dùng để tải xuống mà không cần tải xuống hệ thống của chúng tôi ... .. – Lion789

+1

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên đưa các phần quan trọng của câu trả lời vào đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ review/low-quality-posts/17854998) –

1

Express-csv là một mô-đun lớn để viết nội dung csv để truyền từ máy chủ node.js, sẽ được gửi dưới dạng phản hồi cho ứng dụng khách (và được tải xuống dưới dạng tệp). Rất dễ sử dụng.

app.get('/', function(req, res) { 
    res.csv([ 
    ["a", "b", "c"] 
    , ["d", "e", "f"] 
    ]); 
}); 

Các tài liệu: https://www.npmjs.com/package/express-csv

Khi bạn vượt qua một đối tượng, bạn cần phải thêm vào trước tiêu đề một cách rõ ràng (nếu bạn muốn họ). Dưới đây là tôi ví dụ của tôi sử dụng npm mysql

router.route('/api/report') 
    .get(function(req, res) { 
      query = connection.query('select * from table where table_id=1;', function(err, rows, fields) { 
       if (err) { 
        res.send(err); 
       } 
       var headers = {}; 
       for (key in rows[0]) { 
        headers[key] = key; 
       } 
       rows.unshift(headers); 
       res.csv(rows); 
      }); 
    }); 
+0

Làm cách nào để chuyển từ mã ở trên (đính kèm đối tượng csv vào phản hồi) để cung cấp cho nó dưới dạng tệp mà người dùng có thể tải xuống? – MayNotBe

+0

Tôi thấy bây giờ đó là tất cả những gì cần thiết để trình bày bản tải xuống. Khá ngọt ngào. – MayNotBe

11

đây là những gì tôi đã làm:

  1. Sử dụng json2csv để xây dựng dữ liệu csv từ dữ liệu MongoDB

var json2csv = require('json2csv'); 
var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes']; 
var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes']; 
var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames }); 
  1. Gửi dữ liệu csv tới cli ent

res.attachment('filename.csv'); 
res.status(200).send(data); 
+0

Làm thế nào để bạn tiêu thụ điều này trên giao diện người dùng? – Ohjay44

+0

@ Ohjay44 Tôi đã sử dụng nó cho trang web giao diện người dùng (FE) của tôi bằng cách sử dụng khung công tác js nhanh. Nếu bạn tách API và FE, tôi nghĩ FE và API nên liên lạc với nhau bằng json. Và bạn sẽ xuất dữ liệu json này thành csv trên FE. Tôi có hiểu chính xác câu hỏi của bạn không? –

+0

Nó chỉ ra tất cả những gì tôi cần làm là kích hoạt nó để tải xuống dưới dạng tệp khi tôi nhận được dữ liệu trong Javascript. Tất cả những gì tôi nhận được là tệp ở định dạng thô nên tôi đã nhầm lẫn về cách bắt đầu tải xuống tệp csv khi cuộc gọi của tôi hoàn tất. – Ohjay44

3

Hi guys dựa trên @VierTD trả lời bạn phải sử dụng json2csv để xây dựng dữ liệu csv từ dữ liệu MongoDB

Update Package.json với dependecies

"dependencies": { 
    "mongodb": "^2.2.10", 
    "json2csv": "*", 
    "express": "*" 
    } 

Tạo đối tượng json2CSV, hãy nhớ điều này được lập bản đồ tài liệu (bảng db) của bạn để tên trên "cánh đồng" phải phù hợp với db bảng, fieldnames là tùy thuộc vào bạn nhưng cũng rất quan trọng vì đây là những CSV tên cột tập tin

var json2csv = require('json2csv'); 
var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes']; 
var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes']; 
var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames }); 

dữ liệu csv Gửi cho khách hàng

res.attachment('filename.csv'); 
res.status(200).send(data); 

This code cho thấy làm thế nào để xuất file csv dựa trên tài liệu db Mongo (dữ liệu bảng cơ sở)

Tôi đã tạo mẫu github repo thực sự lấy mẫu ngắn gọn ý tưởng, cũng tạo cơ sở dữ liệu với dữ liệu giả tại Mongo Lab Website để mã này chạy ngay lập tức trong máy tính của bạn.Based trên @VietTD answer!

Trong trường hợp bạn đang quan tâm về kiểm tra mã này chỉ cần nhớ để thay đổi dòng sau

Thay đổi url db (Thành viên của riêng bạn db làm việc này nhưng nó chỉ dành cho mục đích thể hiện; D)

 var url = 'mongodb://admin:[email protected]:63946/misale_dev'; 

Thay đổi tài liệu mục tiêu (hoặc db bảng)

var collection = db.collection('_dummy'); 

cột Thay đổi tài liệu (hoặc các lĩnh vực cột db của bảng)

012.351.
var fields = ['_id', 'JobID', 'LastApplied']; 

Cuối cùng đặt bạn CSV tên cột tiêu đề cũng như tên tập tin CSV

var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE']; 

Cuối cùng nhưng không kém phần quan

res.attachment('yourfilenamehere.csv'); 

Xin vui lòng để cải thiện mẫu mã tôi sẽ đánh giá cao điều đó ! hoặc chỉ cần tải xuống và xem mã, nó đã đi kèm với cơ sở dữ liệu để dễ hiểu và chạy, trong trường hợp bạn không quan tâm ở đây là toàn bộ mã có thể bạn thấy điều thú vị:

// 
// EXPRESS JS SERVER INITI 
// 
var express = require('express') 
var app = express() 

// 
// MONGO DB INIT 
// 
var MongoClient = require('mongodb').MongoClient, assert = require('assert'); 
app.get('/', function (req, res) { 
    var url = 'mongodb://admin:[email protected]:63946/misale_dev'; 
    // 
    // This function should be used for migrating a db table to a TBD format 
    // 
    var migrateMongoDBTable = function(db, callback) { 
     // Get the documents collection 
     console.log("Reading database records"); 
     // Get the documents collection 
     var collection = db.collection('_dummy'); 
     // Find some documents 
     //collection.find({'a': 3}).toArray(function(err, docs) { 
     collection.find({}).toArray(function(err, docs) { 
      assert.equal(err, null); 
      //console.log(docs); 
      //console.log('docs.length ---> ', docs.length); 
      console.log('Creating CSV...'); 
      //console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-='); 
      var json2csv = require('json2csv'); 
      var fields = ['_id', 'JobID', 'LastApplied']; 
      var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE']; 
      var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames }); 
      //console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-='); 
      // EXPORT FILE 
      res.attachment('yourfilenamehere.csv'); 
      res.status(200).send(data); 
      callback(docs); 
     }); 
    }; 

    // Use connect method to connect to the server 
    MongoClient.connect(url, function(err, db) { 
     assert.equal(null, err); 
     console.log("Connected successfully to server"); 
     // 
     // migrate db table to some format TBD 
     // 
     migrateMongoDBTable(db, function() { 
     db.close(); 
     }); 
    }); 

}) 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 
// Connection URL 
//var url = 'mongodb://localhost:27017/myproject'; 

Cảm ơn!

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