如何导出csv nodejs

嘿,我试图从node.js(从MongoDB中拉数据)导出一个csv。 我已经有数据被逗号分隔和所有,但现在我想弄清楚如何实际发送它…我坚持这个代码在我的路线文件。 有关如何获取数据的任何build议,并直接发送给用户请求下载。

这里是代码:(我尝试了代码的第二个函数的底部)

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

你有没有尝试过这样的内容types为“application / octet-stream”

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

或干脆

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

Express send()文档。

这是我做的:

  1. 使用json2csv从mongodb数据build立csv数据
 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. 将csv数据发送到客户端
 res.attachment('filename.csv'); res.status(200).send(data); 

嗨大家基于@VierTD答案你必须使用json2csv从mongodb数据build立csv数据

用dependecies更新Package.json

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

创buildjson2CSV对象,记住这是映射文档(db表),所以“字段”上的名称必须与db表匹配,fieldNames由您决定,但同样重要,因为它们是CSV文件列名

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

将csv数据发送到客户端

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

这段代码演示了如何导出基于mongo db文件的csv文件(数据库表)

我已经创build了一个github回购真正的简单抽样的想法,也创build了一个数据库在Mongo实验室网站的虚拟数据,所以这段代码将立即在您的计算机上运行。基于@ VietTD答案!

如果你有兴趣testing这个代码,只记得改变以下几行

更改数据库url(用户自己的数据库这个作品,但它只是为了显示的目的; D)

  var url = 'mongodb://admin:detroit123@ds063946.mlab.com:63946/misale_dev'; 

更改目标文件(或数据库表)

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

更改文档列(或数据库表的列字段)

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

最后设置您的CSV标题列名称以及您的CSV文件名称

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

最后但并非最不重要的

 res.attachment('yourfilenamehere.csv'); 

请随时提高示例代码,我将不胜感激! 或者只是下载它,看看代码,它已经与数据库,所以它会很容易理解和运行,在这种情况下,你不在乎这里是整个代码也许你看到一些有趣的东西:

 // // 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:detroit123@ds063946.mlab.com: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'; 

谢谢!

我不完全确定你的问题是什么,但我认为你要找的东西可以通过设置Content Disposition头来解决。 看看另一个SO问题上的这个响应: https : //stackoverflow.com/a/7288883/2320243 。

Express-csv是一个很好的模块,用于编写csv内容,从node.js服务器传输,并作为响应发送给客户端(并作为文件下载)。 非常容易使用。

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

文档: https : //www.npmjs.com/package/express-csv

当你传递一个对象时,你需要显式地添加头(如果你想要的话)。 这是我使用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); }); });