Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Upload Google Cloud with Node.js

Olá Pessoal, estou com dificuldades para resolver o seguinte problema. Estou fazendo o upload de aquivos no google cloud storage / firebase storage, depois desse passo, eu gravo o path da url public no banco no-sql, o problema é que quando vai gravar no banco os uploads (multiplos arquivos) no google clould ainda não terminou e o array com o path vai vazio. Pesquisando isso pode ser resolvido com a promise.. mas não tenho tanto conhecimento. Aqui vai o pedaço do código, se alguém puder ajudar...

Por exemplo: Gostaria que o console -> complete promise fosse executado só depois que foi feito todos uplaods para o google cloud(quando termina-se a execução promise runing).


app.post('/upload', (req, res) => {
   ...
   Promise.all(
      files.fotos.map( item => uploadImageAsPromisse(storage, bucketName, fields.album, item))
   );
   //Grava no Banco de Dados o path público
   console.log('complete promise');   
...
}
function uploadImageAsPromisse(storage, bucketName, album, file) {
   storage
      .bucket(bucketName)
      .upload(file.path, { public: true, destination: `albuns/${album}/${file.name}` })
      .then(() => {
           console.log('promise runing');
           console.log(`${file.path} uploaded to ${bucketName}.`);
      })
      .catch(err => {
           console.error('ERROR:', err);
      });
}
3 respostas
solução!

Eu não sei muito bem como funciona a API do Google Cloud, mas eu tentaria resolver mais ou menos assim: 1 - Criaria um array de arquivos; 2 - Criaria um array de promises; 3 - Executaria um Promisse.all; 4 - Com o resultado daria continuidade ao código.

Exemplo: Partindo do princípio que você já possui o array "files.fotos".

// RETORNA A PROMISE AO INVES DE EXECUTAR ELA
function uploadImageAsPromisse(storage, bucketName, album, file) {
    return  storage
          .bucket(bucketName)
          .upload(file.path, { public: true, destination: `albuns/${album}/${file.name}` })
}

// DEFINE ARRAY DE PROMISES E ADICIONA AS PROMISES PARA CADA FOTO
let promises = []
files.fotos.map(foto => {
    promises.push(uploadImageAsPromisse(storage, bucketName, fields.album, foto))
})

// EXECUTA TODAS AS PROMISES DO ARRAY
Promises.all(promises)
    .then(res => {
        //res é um array com o retorno de todas as promises
    })
    .catch(err => {
    })

Muito Obrigado!

Vou fazer o teste e atualizado com o feedback.

Guilherme, Funcionou certinho!

:)