sql >> Database teknologi >  >> NoSQL >> Redis

Sådan får du klienten til at downloade en meget stor fil, der genereres i farten

Excel-eksport:

Brug Streams. Følgende er en grov idé om, hvad der kan gøres:

  1. Brug exceljs modul. Fordi den har en streaming-API rettet mod netop dette problem.

    var Excel = require('exceljs')
    
  2. Da vi forsøger at starte en download. Skriv passende overskrifter til svar.

    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls');
    res.setHeader('Content-type', 'application/vnd.ms-excel');
    
  3. Opret en projektmappe understøttet af Streaming Excel-forfatter. Streamen givet til writer er serversvar.

    var options = {
        stream: res, // write to server response
        useStyles: false,
        useSharedStrings: false
    };
    
    var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
    
  4. Nu er output-streaming-flowet sat op. for input-streaming, foretræk en DB-driver, der giver forespørgselsresultater/markør som en stream.

  5. Definer en asynkronfunktion, der dumper 1 tabel til 1 regneark.

    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. Lad os nu eksportere nogle db-tabeller ved at bruge async-modulets mapSeries:

    async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){
       if(err){
         // log error
       }
       res.end();
    })
    

CSV-eksport:

Til CSV-eksport af et enkelt tabel-/opsamlingsmodul kan fast-csv bruges:

// 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);

Du streamer nu data fra DB til HTTP-svar, og konverterer det til xls/csv-format på farten. Ingen grund til at buffere eller gemme alle data i hukommelsen eller i en fil.



  1. Mongodb $lookup Fungerer ikke med _id

  2. Hvordan udfører man en masseopdatering af dokumenter i MongoDB med Java?

  3. Hvordan sletter man dokumenter efter forespørgsel effektivt i mongo?

  4. Forespørger efter befolkning i Mongoose