1
resposta

ReferenceError: __dirname is not defined

Tentei criar uma função que extrai os links de textos de diferentes arquivos, como ensinado na seção "Faça como eu fiz". Segue meu código:

// index.js 

export async function getFilesLinks(dirPath){
    const absolutePath = path.join(__dirname, '..',dirPath)
    try{
        const files = await fs.promises.readdir(absolutePath, { encoding });
        const data = await Promise.all(
           files.map( async (filename) => {
                const fileDir = `${absolutePath}/${filename}`
                const text = await fs.promises.readFile(fileDir, encoding);
                return getLinks(text);
           })
        );
        return data;
    }
    catch(err){
        treatError(err, dirPath)
    }
}
//cli.js

import chalk from 'chalk'; 
import { getFilesLinks } from './index.js';

const  path = process.argv 

async function displayLinks(path){
    const text = await getFilesLinks(path[2]);
    console.log(chalk.bgWhiteBright(chalk.red('links list:')), text)
}

displayLinks(path)

E estou recebendo o seguinte erro no terminal:

➜  lib-markdown node cli.js ./files

    const absolutePath = path.join(__dirname, '..',dirPath)
                                                               ^

ReferenceError: __dirname is not defined
    at getFilesLinks (file:///Users/igortb/Documents/code/practice/js/lib-markdown/index.js:40:36)
    at displayLinks (file:///Users/igortb/Documents/code/practice/js/lib-markdown/cli.js:7:24)
    at file:///Users/igortb/Documents/code/practice/js/lib-markdown/cli.js:11:1
    at ModuleJob.run (node:internal/modules/esm/module_job:197:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:61:12)
1 resposta

Oi, Igor! Tudo bem?

Desculpa a demora por um retorno.

O erro recebido nos informa que a variável __dirname não está definida no contexto do módulo ESM (ECMAScript Modules).

Uma solução para isso é utilizar a propriedade import.meta.url para obter o caminho absoluto do arquivo atual. Em seguida, podemos utilizar o módulo path para manipular esse caminho.

Aqui está uma modificação no código para corrigir o erro:

// index.js
import { fileURLToPath } from 'url';
import { dirname } from 'path';

export async function getFilesLinks(dirPath) {
    const currentFilePath = fileURLToPath(import.meta.url);
    const currentDir = dirname(currentFilePath);
    const absolutePath = path.join(currentDir, '..', dirPath);

    // Resto do seu código...
}

// cli.js
import { fileURLToPath } from 'url';
import { dirname } from 'path';
import chalk from 'chalk'; 
import { getFilesLinks } from './index.js';

const currentFilePath = fileURLToPath(import.meta.url);
const currentDir = dirname(currentFilePath);
const path = process.argv;

async function displayLinks(path) {
    const text = await getFilesLinks(path[2]);
    console.log(chalk.bgWhiteBright(chalk.red('links list:')), text);
}

displayLinks(path);

Dessa forma, estaremos obtendo o caminho absoluto do arquivo atual e utilizando-o para construir o caminho absoluto para o diretório que desejamos acessar.

Espero ter ajudado na compreensão do problema. Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓

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