Método assíncrono

1 resposta Resolvido
javascriptnodejs
V

Estou usando node-firebird para conversão de uma imagem do tipo blob para base64, o problema é que o método é assíncrono e com isso não consigo inserir a BASE64 na lista (linha 7) antes do res.json(rows)

A duvida é: Como contornar isso? é possível fazer a linha 6 deixar de ser assíncrona?

...
    connection.query(query,function(err,rows){
      if(err) {
        res.json({"Error" : true, "Message" : "Error executing query"}); 
      } else {
        for(var i = 0; i < rows.length; i++){ //  a lista que retorna do BD
          readBlobToBase64Promise(rows[i]).then((base64)=>{ // transforma a imagem em base 64
            rows[i] = IMAGEM_BASE64 = base64;
          });
        } // fim for
      } // fim else        
      connection.detach(); // conexao
      res.json(rows); // retorna a lista da consulta
    });


    function readBlobToBase64Promise(row){
      var base64 = new Promise((resolve, reject) => {
        row.IMAGEM(function(err, name, eventEmitter) {
          let buffers = [];
          eventEmitter.on('data', (chunk) => {
            buffers.push(chunk);
          });
          eventEmitter.once('end', () => {
            let buffer = Buffer.concat(buffers);
            resolve(buffer.toString('base64'));
          });
          eventEmitter.once('error', (err) => {
            reject(err);
          });
        });
      });
      return base64;
    }
...

1 Resposta

V
Solucao aceita

Solução (Node 7.6+) :

connection.query(query,function(err,rows){
      if(err) {
        res.json({"Error" : true, "Message" : "Error executing query"});
      } else {
        readRows(rows);
      } // fim else
    });


    async function readRows(rows) {
      for(var i = 0; i < rows.length; i++){ //  a lista que retorna do BD
        var base64 = await readBlobToBase64Promise(rows[i]);
        rows[i].IMAGEM_BASE64 = base64;

      }
      connection.detach(); // conexao
      res.json(rows); // retorna a lista da consulta
    }



    function readBlobToBase64Promise(row) {
      return new Promise((resolve, reject) => {
        row.IMAGEM(function(err, name, eventEmitter) {
          let buffers = [];
          eventEmitter.on('data', (chunk) => {
            buffers.push(chunk);
          });
          eventEmitter.once('end', () => {
            let buffer = Buffer.concat(buffers);
            resolve(buffer.toString('base64'));
          });
          eventEmitter.once('error', (err) => {
            reject(err);
          });
        });
      });
    }
Criado 25 de outubro de 2017
Ultima resposta 27 de out. de 2017
Respostas 1
Participantes 1