Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como fazer o cliente baixar um arquivo muito grande que é gerado na hora


Exportação do Excel:

Use fluxos. Segue uma ideia aproximada do que pode ser feito:

  1. Use o módulo exceljs. Porque possui uma API de streaming voltada para esse problema exato.
    var Excel = require('exceljs')
    

  2. Já que estamos tentando iniciar um download. Escreva cabeçalhos apropriados para a resposta.
    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=db_dump.xls');
    res.setHeader('Content-type', 'application/vnd.ms-excel');
    

  3. Crie uma pasta de trabalho com o suporte do Streaming Excel writer. O fluxo dado ao escritor é a resposta do servidor.
    var options = {
        stream: res, // write to server response
        useStyles: false,
        useSharedStrings: false
    };
    
    var workbook = new Excel.stream.xlsx.WorkbookWriter(options);
    

  4. Agora, o fluxo de streaming de saída está configurado. para o fluxo de entrada, prefira um driver de banco de dados que forneça resultados/cursor de consulta como um fluxo.

  5. Defina uma função assíncrona que despeja 1 tabela em 1 planilha.
    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. Agora, vamos exportar algumas tabelas db, usando mapSeries do módulo assíncrono:
    async.mapSeries(['cars','planes','trucks'],tableToSheet,function(err){
       if(err){
         // log error
       }
       res.end();
    })
    

Exportação CSV:

Para exportação CSV de um único módulo de tabela/coleção, o fast-csv pode ser usado:
// 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);

Agora você está transmitindo dados do banco de dados para resposta HTTP, convertendo-os no formato xls/csv em tempo real. Não há necessidade de buffer ou armazenar todos os dados na memória ou em um arquivo.