2
respostas

Bug no programa

import fs from 'fs';
import path from 'path';
import trataErros from './erros/funcoesErro.js';
import { contaPalavras } from './index.js';
import { montaSaidaArquivo } from './helpers.js';
import { Command } from 'commander';
import chalk from 'chalk';

const program = new Command();

program
  .version('0.0.1')
  .option('-t, --texto <string>', 'caminho do texto a ser processado')
  .option('-d, --destino <string>', 'caminho da pasta onde salvar o arquivo de resultados')
  .action((options) => {
    const { texto, destino } = options;

    if (!texto || !destino) {
      console.error(chalk.red('erro: favor inserir caminho de origem e destino'))
      program.help();
      return;
    }

    const caminhoTexto = path.resolve(texto);
    const caminhoDestino = path.resolve(destino);

    try {
      processaArquivo(caminhoTexto, caminhoDestino);
      console.log(chalk.green('texto processado com sucesso'));
    } catch (erro) {
      console.log('ocorreu um erro no processamento', erro);
    }
  })

program.parse();

function processaArquivo(texto, destino) {
  fs.readFile(texto, 'utf-8', (erro, texto) => {
    try {
      if (erro) throw erro
      const resultado = contaPalavras(texto);
      criaESalvaArquivo(resultado, destino)
    } catch(erro) {
      trataErros(erro);
    }
  })
}


async function criaESalvaArquivo(listaPalavras, endereco) {
  const arquivoNovo = `${endereco}/resultado.txt`;
  const textoPalavras = montaSaidaArquivo(listaPalavras);
  try {
    await fs.promises.writeFile(arquivoNovo, textoPalavras);
    console.log('arquivo criado');
  } catch(erro) {
    throw erro;
  }
}

// function criaESalvaArquivo(listaPalavras, endereco) {
//   const arquivoNovo = `${endereco}/resultado.txt`;
//   const textoPalavras = JSON.stringify(listaPalavras);
  
//   fs.promises.writeFile(arquivoNovo, textoPalavras)
//     .then(() => {
//       console.log('arquivo criado');
//     })
//     .catch((erro) => {
//       throw erro
//     })
//     .finally(() => console.log('operação finalizada'))
// }

Eu testei passar o caminho errado para o processamento do texto, mas apesar do erro que apareceu, apareceu também a mensagem de "texto processado com sucesso" em:

 try{
        processaArquivo(caminhoTexto, caminhoDestino);
        console.log(chalk.green('texto processado com sucesso'));
    }catch(erro){
        console.log('ocorreu um erro no processamento', erro)
    }

Como posso arrumar?

2 respostas

Oi Luidi,

Isso acontece porque a função processaArquivo é assíncrona e o bloco try...catch que envolve a chamada dela não está esperando a conclusão da função antes de executar o console.log de sucesso. 😳

Para corrigir isso, você precisa usar async/await para que o código espere a função processaArquivo terminar antes de prosseguir.

Veja como:

  .action(async (options) => { // Adicione async aqui
    const { texto, destino } = options;

    if (!texto || !destino) {
      console.error(chalk.red('erro: favor inserir caminho de origem e destino'))
      program.help();
      return;
    }

    const caminhoTexto = path.resolve(texto);
    const caminhoDestino = path.resolve(destino);

    try {
      await processaArquivo(caminhoTexto, caminhoDestino); // Adicione await aqui
      console.log(chalk.green('texto processado com sucesso'));
    } catch (erro) {
      console.log('ocorreu um erro no processamento', erro);
    }
  })

Ao adicionar async na função do action e await na chamada de processaArquivo, você garante que o código espere a função terminar e, se houver um erro, ele será capturado corretamente no bloco catch. 👍

Para saber mais: Documentação do async/await no MDN.

Continue praticando e explorando novas soluções! 💪

Eu tentei fazer isso mas não funcionou, funcionou pra vc?