Método assíncrono

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++){ // lê 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;
    }
...

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++){ // lê 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);
          });
        });
      });
    }
1 curtida