Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 面向用户的nodejscsv数据导出系统_Node.js_Csv - Fatal编程技术网

Node.js 面向用户的nodejscsv数据导出系统

Node.js 面向用户的nodejscsv数据导出系统,node.js,csv,Node.js,Csv,我需要允许用户以csv格式导出数据。我已经在nodejs中编写了应用程序。用户的导出数据可能非常庞大。所以我想知道如何在nodejs中处理这种情况。我应该使用process.nexttick还是nodejs的子进程api?nodejs还可以使用任何好的模块将数据从mysql转换为csv。从mysql数据库中逐行读取数据,并逐行添加到文件中 我对mysqlmodule不太了解,所以我在这里假设每一行都只是一个数组,因此是“row.join(';')”。如果不是这样(可能是一个对象),你应该修复它

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

从mysql数据库中逐行读取数据,并逐行添加到文件中

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

如果您有很多请求,您可以使用该模块分配您的工作负载

接受的答案不起作用,因为CSV文件由
分隔,
而不是
。此外,在每行结束后没有换行符
\n
,并且
字段
对象包含有关
列属性的信息
而不是
数据行
<代码>结果
包含查询产生的行。因此,我编写了自己的代码来生成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();
 });
});
pool.query('SELECT*FROM category',函数(错误、结果、字段){
var reportFile=Date.now();
fs.closeSync(fs.openSync(_dirname+'/../reports/'+reportFile+'.csv',w'));
var属性=[];
var行=[];

对于(var x=0;x什么是数据量大?您是否正在运行一个应根据请求导出该数据的Web应用程序?我可以肯定地告诉您,您不应该使用process.nextTick。使用流(从数据库到您的csv生成器到您的客户端的流)我的意思是数据可能很大,比如说10-20 MB或更多,你需要实时创建csv?不,实际上我可以在流程完成后给用户发送电子邮件谢谢你的回答。我现在正在尝试。你认为我们也可以利用这个模块吗?我还想问,我是应该在processs.nexttick中执行此流程,还是在child process中执行此流程?阅读最后一行我的答案是!compute cluster使用childprocesses。如果您保持在同一个进程中,您可以在每一个新的csv生成开始时使用process.nextTick写入每一行的文件?我的示例代码?是!阅读fs.appendFile的作用: