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

Verificação de erros com Streams

Olá pessoal!

No estilo buffer mode (fs.readFile/writeFile), o instrutor explica a possibilidade de verificar o erro nas funções de callback:

    var fs = require('fs');

    var arquivo = process.argv[2];

    fs.readFile(arquivo, function(err, buffer) { // <--
        fs.writeFile("arquivo-novo.jpg"), buffer, function(err) { // <--
            console.log('arquivo comprimido.');
        });
      });
    });

Com streams, como capturar possíveis erros, tanto no leitura (createReadStream) quanto na escrita (createWriteStream) ?

    var fs = require('fs');

    fs.createReadStream('arquivo.txt')

      .pipe(fs.createWriteStream('arquivo.txt'))

      .on('finish', function(){
        console.log('arquivo escrito.');
      });

Aguardo, desde já obrigado!

Atenciosamente.

8 respostas

Elías, boa tarde!

Os Streams podem emitir um evento de erro. Você pode ouvir esse evento para impedir o comportamento padrão de gerar o erro:

raw.on('error', function(erro) {
  // faça algo com o erro
});

Espero ter ajudado e bons estudos!

Olá Felipe!

Então onde/como ficaria o raw.on no código que postei na mensagem anterior à tua?

Aguardo, desde já obrigado!

Atenciosamente.

De acordo com o seu código seria algo assim :

 var fs = require('fs');

 fs.createReadStream('arquivo.txt')
 .pipe(fs.createWriteStream('arquivo.txt'))
 .on('error', function(erro) {
      // faça algo com o erro
 })
 .on('finish', function(){
       console.log('arquivo escrito.');
 });

Bruno, bom dia!

A função pipe() não passa erro da origem para o destino nem do destino para a origem. Veja o código original.

Veja como você pode lidar com seu erro, como você notará, não é responsabilidade do createWriteStream emitir o erro.

var fs = require('fs');

let resultado = fs.createReadStream('arquivo.txt');
resultado.on('error', (erro) => fs.createWriteStream('arquivo.txt')) // Caso ele não encontra o arquivo ele cria um

Espero ter ajudado e bons estudos!

Olá pessoal!

Breno e Felipe, obrigado pelos retornos.

Felipe, como ficaria o teu código de tratamento de erros acima, aplicando-o para tratar erro tanto createReadStream quanto no createWriteStream do seguinte código (é o mesmo código de mais acima, apenas para facilitar estou repetindo-o) :

var fs = require('fs');

fs.createReadStream('arquivo.txt')
  .pipe(fs.createWriteStream('arquivo.txt'))
  .on('finish', function(){
    console.log('arquivo escrito.');
  });

Aguardo, desde já obrigado!

Atenciosamente.

Olá Felipe,

Chegastes a ver minha última mensagem?

Aguardo, desde já obrigado!

Atenciosamente.

Eliás, bom dia!

Eu partiria da mesma ideia acima, salvando em uma variável e aplicando um listener para o erro, ficando da maneira abaixo:

var fs = require('fs');

let resultado = fs.createReadStream('arquivo.txt');
resultado.on('error', (erro) => console.log(erro))
resultado.on('finish', () => {
  file = fs.createWriteStream('arquivo.txt')
  file.on('error', (erro) => {
    console.log(erro);
    file.end();
  })
})

Espero ter ajudado e bons estudos!

solução!

Olá Felipe,

Obrigado pelo retorno.

Felipe, perguntei aqui no fórum para ter uma resposta de código no padrão do curso, porém como ao testar o teu código para mim pelo menos não funcionou, acabei pesquisando direto na documentação do Node.js, abaixo uma maneira que encontrei:

 var fs = require('fs');

  var fileRead = fs.createReadStream('arquivo.txt');
  var fileWrite = fs.createWriteStream('arquivoCopia.txt');

  fileRead.on('error', 
    function(error) {
      console.log('\n' + 'Erro na leitura do arquivo');
      console.log(error);
    }
  );

  fileWrite.on('error', 
    function(error) {
      console.log('\n' + 'Erro na escrita do arquivo');
      console.log(error);
    }
  );

  fileWrite.on('finish', function() {
    console.log('Cópia concluída');
  });

  fileRead.pipe(fileWrite);

Atenciosamente.