Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Jak zmusić klienta do pobrania bardzo dużego pliku, który jest generowany w locie?

Eksport Excela:

Użyj strumieni. Poniżej znajduje się przybliżone wyobrażenie o tym, co można zrobić:

  1. Użyj modułu exceljs. Ponieważ ma interfejs API do przesyłania strumieniowego, którego celem jest właśnie ten problem.

    var Excel = require('exceljs')
    
  2. Ponieważ próbujemy rozpocząć pobieranie. Wpisz odpowiednie nagłówki do odpowiedzi.

    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls');
    res.setHeader('Content-type', 'application/vnd.ms-excel');
    
  3. Utwórz skoroszyt oparty na programie do zapisywania strumieniowego programu Excel. Strumień przekazany do pisarza to odpowiedź serwera.

    var options = {
        stream: res, // write to server response
        useStyles: false,
        useSharedStrings: false
    };
    
    var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
    
  4. Teraz przepływ strumienia wyjściowego jest skonfigurowany. do przesyłania strumieniowego danych wejściowych preferuj sterownik DB, który podaje wyniki/kursor zapytania jako strumień.

  5. Zdefiniuj funkcję asynchroniczną, która zrzuca 1 tabelę do 1 arkusza roboczego.

    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. Teraz wyeksportujmy niektóre tabele db, używając modułu mapSeries modułu asynchronicznego:

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

Eksport CSV:

Do eksportu CSV pojedynczej tabeli/modułu kolekcji można użyć szybkiego csv:

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

Przesyłasz teraz dane z bazy danych do odpowiedzi HTTP, konwertując je w locie do formatu xls/csv. Nie ma potrzeby buforowania ani przechowywania całych danych w pamięci lub w pliku.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jaka jest korzyść z klastrowania Redis na różnych hostach?

  2. Limit czasu StackExchange.Redis

  3. Jak anulować zadanie w kolejce w Laravel lub Redis?

  4. Jak usunąć wszystkie dane w Redis

  5. Jak stworzyć model we wzorcu DRY za pomocą flow.js (dla wywołań asynchronicznych) w node.js?