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

Problemas com o retorno dos links no terminal

Boa tarde! Tenho 2 problemas em relação ao retorno das urls como string no terminal: O primeiro deles é que, depois de seguir o exercício de inserir o "readdir" para ler o diretório do projeto, ao executar o "npm run cli validar" ele sempre me retorna o throw new Error customizado pra "Não há arquivo no caminho". Eu alterei o package.json pra ter o "type":"module", importei "fileURLtoPath e "dirname" e tentei também usar uma solução que encontrei no StackFlow.

O segundo problema era que antes de "readdir" ser implementado, a execução retornava apenas "{objects}" sem os valores da url como string, mas a lógica da validação funcionava.

segue o código do index.js, e também o link do meu projeto:

import chalk from 'chalk';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import {dirname} from 'path'

  function extraiLinks(texto){
      const regex = /\[([^\]]*)\]\((https?:\/\/[^$#\s].[^\s]*)\)/gm;
      const arrayResultados = [];
        let temp;
      while((temp = regex.exec(texto)) !== null ){
          arrayResultados.push({[temp[1]]: temp[2]})
      }
      return arrayResultados.length === 0 ? 'Não há links' : arrayResultados;
  }

function trataErro(erro) {
    throw new Error(chalk.red(erro.code, 'Não há arquivo no caminho'));
}

export default async function pegarArquivo(caminho) {
    const __filename = fileURLToPath(import.meta.url)
    const __dirname = dirname(__filename);

    const caminhoAbsoluto = path.join(__dirname, '..', caminho);
    const encoding = 'utf-8';

    try{
        const arquivos = await fs.promises.readdir(caminhoAbsoluto, {encoding});
        const result = await Promise.all(arquivos.map(async (arquivo) => {
        const localArquivo = `${caminhoAbsoluto}/${arquivo}`;
        const texto = await fs.promises.readFile(localArquivo, encoding);
         return extraiLinks(texto);
     }));    
     return result;
    }
    catch(erro){
        return trataErro(erro);
    }
   }

O link do meu projeto: https://drive.google.com/drive/folders/1ueOrid_MxP3hBsqYUEZitjPSD5iei27T?usp=sharing

2 respostas
solução!

Olá

Não consegui ter acesso ao seu código, mas o que você pode olhar para ver o que está errado provavelmente é nessa linha:

    const caminhoAbsoluto = path.join(__dirname, '..', caminho);

Você pode colocar um console.log e ver com o que caminhoAbsoluto está sendo preenchido:

const caminhoAbsoluto = path.join(__dirname, '..', caminho);
console.log(chalk.yellow(`cainhaAbsoluto: ${caminhoAbsoluto}\n`))

Essa função de erro também ajuda umpouco mais:

function trataErro(erro) {
    if (erro.code === 'ENOENT') {
        throw new Error(chalk.red(erro.code, 'não encontrei o arquivo'));
    } else if ( erro.code === 'EISDIR') {
        throw new Error(chalk.red(erro.code, 'é um caminho, e espero um arquivo'));
    } else {
        throw new Error(chalk.red(erro.code, 'ocorreu um erro inesperado'));
    }
}

Eu alterei e a função pegaArquivo como abaixo e funcionou, mas agora o problema deve dar em outro lugar, testa ai e ve como fica.

const caminhoAbsoluto = path.join(__dirname, "/arquivos");

Muitíssimo obrigado Diego! De fato alterar o path.join(dirname, "/arquivos") ajudou bastante!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software