我需要允许用户以csv格式导出他们的数据。我在nodejs中编写了应用程序。用户的导出数据可能很大。所以我想知道如何处理nodejs中的这种情况。我应该用user.nexttick或子进程api of nodejs吗?还有什么好的模块可用于nodejs将数据从mysql转换为csv。
答案 0 :(得分:2)
从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
});
如果您有很多请求,可以使用compute-cluster模块分发工作负载
答案 1 :(得分:1)
接受的答案无效,因为CSV文件由,
而非;
分隔。此外,每行结束后没有换行符\n
,fields
对象包含有关column attributes
而不是data rows
的信息。 results
包含查询产生的行。因此,我编写了自己的代码来生成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();
});
});