如何使用Node.js正确地将对象数组转换为CSV文件?

我需要执行一个mongo查询并将结果转换为CSV文件。 我遇到了node-csv但我不知道如何将查询结果传递给这个模块来转换它,并实际上生成一个文件。

所以我读了这个(适应我的代码有点适合我的查询例子):

 var generate = require('csv-generate'); var generator = generate({objectMode: true, headers: 7}); var columns = { _id: '_id', first_name: 'first_name', last_name: 'last_name', team: 'team.name', position: 'position', status: 'status' }; var stringifier = stringify({ header: true, columns: columns }); generator.pipe(stringifier).pipe(process.stdout); 

我做的查询如:

 Player.find({},{_id: true, first_name: true, last_name: true, "team.name": true, position: true, status:true}).exec(function (err,players){ // Should CONVERT to CSV string AND generate file HERE }); 

但是,我真的不知道为了生成一个CSVstring,并将其转换为文件的例子,我应该遵循什么步骤。

好的方式(这也是内存友好)是使用stream。 首先,您执行MongoDB请求:

 collection.find({ some: "thing" }, function (err, cursor) { if (err) { return ...; } function next () { cursor.nextObject(function (err, obj) { if (err) { return ...; } if (obj === null) { return outputStream.end(); } outputStream.write(stringify(obj)); next(); }); } next(); }); 

outputStream可能是一个HTTP响应stream(假设你在一个http服务器请求 – 响应中)或其他任何可写的stream。

这或多或less只是一个基本的例子 – 可能会有所改进,但我推荐这样做:将对象一个一个地串起来,然后写入stream中。

用mongoose,你可以用stream()方法获得可读的stream。 然后用csv变换streampipe道:

  var stringifier = csv.stringify({ header: true, columns: columns }); Player.find() .stream() .pipe(csv.transform(function(record){ record = record.toObject() //convert mongoose document to JS object return Object.keys(record).map(function(key){return record[key]}) // return array of columns })) .pipe(stringifier) .pipe(fs.createWriteStream('out.csv')); 

你也可以直接从“csv.transform”中的处理函数中返回js对象。 “csv.stringify”将在提供列选项时接受对象。