Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] Projeto final apresenta um erro ao rodar um arquivo sem links com a opção 'valida' (+ solução)

Testando o código após sua finalização de acordo com as aulas, notei que existe um bug. A execução exibe um erro quando passamos um arquivo que não contém links (ou um diretório que tenha um arquivo sem links) e a opção 'valida'.

Quando executamos o cli.js passando um arquivo sem links, a função processaTexto passa o caminho do arquivo como argumento para pegaArquivo(), que por sua vez passa o conteúdo (texto) do arquivo como argumento para extraiLinks() (em 'index.js'; existe outra função com o mesmo nome em 'http-validacao.js'). Se não há links no arquivo, extraiLinks() retorna a string 'Não há links neste arquivo' para pegaArquivo, que por sua vez devolve a mesma string para processaTexto().

Na sequência, processaTexto() passa essa string como argumento para imprimeLinks(). Quando a opção 'valida' não é informada no comando, essa string é exibida no console, conforme o esperado, informando que não há links naquele arquivo. Isso funciona tanto quando informamos um arquivo sem links quanto quando informamos um diretório que contenha um arquivo sem links.

Porém, se é passada a opção 'valida' no comando inicial, ao chegar em imprimeLinks(), essa função passa a string 'Não há links neste arquivo' como argumento para listaValidada(), que então repassa essa mesma string como argumento de extraiLinks() (dessa vez em 'http-validacao.js'). É aí que ocorre o problema, pois a função extrai links tenta executar o método map() na string, disparando um erro (já que map() é um método de arrays que não funciona para strings). Essa situação ocorre tanto no caso em que é passado inicialmente um arquivo quanto no caso de um diretório (desde que, reforçando, o arquivo não contenha links, ou o diretório contenha pelo menos um arquivo sem links).

Para tratar essa situação, eu adicionei uma verificação na função imprimeLinks(), que ficou assim:

async function imprimeLinks(valida, resultado, identificador = ''){
    //O código só irá entrar na etapa de validação se a opção 'valida' foi informada
    //no terminal E o argumento passado por processaTexto() for um array
    if (valida && Array.isArray(resultado)){
        console.log(chalk.yellow('Lista validada'), chalk.black.bgGreen(identificador), await listaValidada(resultado));
    //Dessa forma, quando chegar uma string como argumento, essa string é o que será exibido no console
    } else{
        console.log(chalk.yellow('Lista de links'), chalk.black.bgGreen(identificador), resultado);
    }
};

Dessa forma, quando imprimeLinks() recebe de processaTexto() uma string em vez de um array, ela não entra na parte de validação dos links e exibe no console a string 'Não há links neste arquivo', como se a opção 'valida' não tivesse sido informada.

1 resposta
solução!

Oi, Vinícius! Tudo bem?

Muito obrigada por compartilhar o bug e a solução com a nossa comunidade do fórum! Super interessante poder observar a sua solução implementando a verificação na função imprimeLinks(), evitando, assim, que a função extraiLinks() tente executar o método map() em uma string, o que geraria um erro.

Bate um orgulho poder observar nossos alunos desenvolvendo soluções para problemas por conta própria! Tenho certeza também que esse post servirá de ajuda para muitos colegas.

Somado a isso, caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!