Excel-export:
Gebruik Stromen. Hieronder volgt een ruw idee van wat er gedaan zou kunnen worden:
-
Exceljs-module gebruiken. Omdat het een streaming-API heeft die precies op dit probleem is gericht.
var Excel = require('exceljs')
-
Aangezien we een download proberen te starten. Schrijf de juiste koppen naar het antwoord.
res.status(200); res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls'); res.setHeader('Content-type', 'application/vnd.ms-excel');
-
Maak een werkmap ondersteund door Streaming Excel-schrijver. De stream die aan de schrijver wordt gegeven, is de serverreactie.
var options = { stream: res, // write to server response useStyles: false, useSharedStrings: false }; var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
-
Nu is de output-streamingstroom helemaal ingesteld. voor de invoer-streaming, geef de voorkeur aan een DB-stuurprogramma dat queryresultaten/cursor als een stream geeft.
-
Definieer een asynchrone functie die 1 tabel naar 1 werkblad dumpt.
var tableToSheet = function (name, done) { var str = dbDriver.query('SELECT * FROM ' + name).stream(); var sheet = workbook.addWorksheet(name); str.on('data', function (d) { sheet.addRow(d).commit(); // format object if required }); str.on('end', function () { sheet.commit(); done(); }); str.on('error', function (err) { done(err); }); }
-
Laten we nu enkele db-tabellen exporteren met de mapSeries van de async-module:
async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){ if(err){ // log error } res.end(); })
CSV-export:
Voor CSV-export van een enkele tabel/verzamelingsmodule kan fast-csv worden gebruikt:
// response headers as usual
res.status(200);
res.setHeader('Content-disposition', 'attachment; filename=mytable_dump.csv');
res.setHeader('Content-type', 'text/csv');
// create csv stream
var csv = require('fast-csv');
var csvStr = csv.createWriteStream({headers: true});
// open database stream
var dbStr = dbDriver.query('SELECT * from mytable').stream();
// connect the streams
dbStr.pipe(csvStr).pipe(res);
U streamt nu gegevens van DB naar HTTP-respons en converteert deze in een oogwenk naar xls/csv-indeling. Het is niet nodig om de volledige gegevens te bufferen of op te slaan in het geheugen of in een bestand.