3

我需要允许用户以 csv 格式导出他们的数据。我在 nodejs 中编写了应用程序。用户的导出数据可能非常庞大。所以我想知道如何在nodejs中处理这种情况。我应该使用nodejs的process.nexttick还是子进程api?还有任何好的模块可用于 nodejs 将数据从 mysql 转换为 csv。

4

2 回答 2

3

从您的 mysql-db 中逐行读取,并逐行附加到您的文件中

我对mysqlmodule不太了解,所以我假设这里的每一行只是一个数组,因此是'row.join(';')'。如果不是这种情况(也许它是一个对象),你应该解决这个问题。

var fs = require('fs');
var connection = require('mysql').createConnection({yourdbsettingshere});

function processRow (row) {
  fs.appendFile('your-file.csv', row.join(';'), function (err) {
    connection.resume();
  });
}

var query = connection.query('SELECT * FROM WHATEVER');

query
  .on('error', function(err) {
    // do something when an error happens
  })
 .on('fields', function(fields) {
   processRow(fields);
 })
 .on('result', function(row) {
   // Pausing the connnection is useful if your processing involves I/O
   connection.pause();
   processRow(row, function (err) {
     connection.resume();
   });
 })
 .on('end', function() {
    // now you can mail your user
 });

如果您有很多请求,您可以使用计算集群模块来分配您的工作负载

于 2013-06-20T06:28:46.210 回答
1

接受的答案不起作用,因为 CSV 文件由,not分隔;\n此外,每行末尾没有换行符,并且fields对象包含有关column attributesnot 的信息data rowsresults包含查询结果的行。因此,我编写了自己的代码来生成 CSV 文件。如果您需要更多解释,请发表评论,我会提供。

pool.query('SELECT * FROM category', function (error, results, fields) {
 var reportFile = Date.now();
 fs.closeSync(fs.openSync(__dirname + '/../reports/' + reportFile + '.csv', 'w'));
 var attributes = [];
 var row = [];
 for(var x = 0; x<fields.length; x++) attributes.push(fields[x].name);
 fs.appendFile(__dirname + '/../reports/' + reportFile + '.csv', attributes.join(','), function (err) {
    if(err) console.log('Error appending fields', err);
    fs.appendFileSync(__dirname + '/../reports/' + reportFile + '.csv', '\n');
    for(var x = 0; x<results.length; x++) {
        row = [];
        for(var y = 0; y<attributes.length; y++){
            row.push(results[x][attributes[y]]);
        }
        fs.appendFileSync(__dirname + '/../reports/' + reportFile + '.csv', row.join(','));
        fs.appendFileSync(__dirname + '/../reports/' + reportFile + '.csv', '\n');
    }
    req.reportFile = reportFile;
    next();
 });
});
于 2017-04-19T13:03:42.763 回答