sql >> Database >  >> NoSQL >> Redis

Hoe de client een zeer groot bestand te laten downloaden dat on-the-fly wordt gegenereerd?

Excel-export:

Gebruik Stromen. Hieronder volgt een ruw idee van wat er gedaan zou kunnen worden:

  1. Exceljs-module gebruiken. Omdat het een streaming-API heeft die precies op dit probleem is gericht.

    var Excel = require('exceljs')
    
  2. 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');
    
  3. 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);
    
  4. 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.

  5. 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);
        });
    }
    
  6. 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.



  1. Node + Mongoose:Laatst ingevoegde ID ophalen?

  2. 3 manieren om de rij met de minimumwaarde in SQL te selecteren

  3. stel veld als leeg in voor mongo-object met behulp van mangoest

  4. Wat betekent te veel positionele opties bij het doen van een mongo-export?