sql >> Databasteknik >  >> NoSQL >> Redis

Hur man får klienten att ladda ner en mycket stor fil som genereras i farten

Excel-export:

Använd Streams. Följande är en grov uppfattning om vad som kan göras:

  1. Använd exceljs-modulen. Eftersom den har ett streaming-API som syftar till just detta problem.

    var Excel = require('exceljs')
    
  2. Eftersom vi försöker starta en nedladdning. Skriv lämpliga rubriker till svaret.

    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls');
    res.setHeader('Content-type', 'application/vnd.ms-excel');
    
  3. Skapa en arbetsbok med stöd av Streaming Excel-skrivare. Strömmen som ges till writer är serversvar.

    var options = {
        stream: res, // write to server response
        useStyles: false,
        useSharedStrings: false
    };
    
    var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
    
  4. Nu är strömningsflödet för utmatning klar. för indataströmning, föredra en DB-drivrutin som ger sökresultat/markör som en stream.

  5. Definiera en asynkronfunktion som dumpar 1 tabell till 1 kalkylblad.

    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. Låt oss nu exportera några db-tabeller med hjälp av async-modulens mapSeries:

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

CSV-export:

För CSV-export av en enskild tabell/samlingsmodul kan fast-csv användas:

// 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 strömmar nu data från DB till HTTP-svar och konverterar det till xls/csv-format i farten. Inget behov av att buffra eller lagra hela data i minnet eller i en fil.



  1. Bulk insatsprestanda i MongoDB för stora samlingar

  2. Bästa sättet att lagra redis-nycklar

  3. StackExchange.Redis hur man prenumererar på flera kanaler

  4. Vad är Mongoose-felet Cast to ObjectId misslyckades för värde XXX vid sökväg _id?