Eduardo
He estado usando la versión Node 12.3.4
Lo actualicé a 14.14.0 y comencé a recibir muchos problemas que solucioné. lo unico que no entiendo es el tema
__dirname is not defined
__dirname
es una variable central en Node como sé, ¿se elimina en Node 14?
¿Cómo estás cargando el archivo? De acuerdo con este problema, el problema surge si lo carga como un módulo ECMAScript que no contiene __dirname.
https://github.com/nodejs/help/issues/2907#issuecomment-671782092
Siguiendo la documentación a continuación, es posible que pueda resolver el problema:
https://nodejs.org/api/esm.html#esm_no_require_exports_module_exports_filename_dirname
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
-
Gran respuesta. Funcionó como el encanto.
– raj240
9 dic 2021 a las 10:04
-
Obtuve “dirname no está definido”, por lo que la última línea que tuve que cambiar a
const __dirname = path.dirname(__filename);
– 6 bytes
28 de febrero de 2022 a las 22:22
-
Esto coincide con el consejo “oficial” sobre github.com/nodejs/help/issues/2907#issuecomment-757446568
– Beni Cherniavsky-Paskin
28 de marzo de 2022 a las 18:37
-
Muchas gracias. Estaba atascado en esto. Reformateé a es6 y la importación de mi ‘ruta’ se rompió. El código anterior era algo así como res.status(200).sendFile(path.join(__dirname, ‘/public/main.js’)). Usé las importaciones que recomendó y cambié a res.status(200).sendFile(__dirname + ‘/public/main.js’). De nuevo, gracias, gracias.
– Tim Sonner
26 de septiembre de 2022 a las 11:26
jiyoon hur
Mi código antes era como el siguiente.
app.use(express.static(path.join(__dirname, 'public')));
Y tengo este error.
ReferenceError: __dirname no está definido en el alcance del módulo ES
Y resolví esto agregando el código a continuación.
import path from 'path';
const __dirname = path.resolve();
-
Esto solo resuelve el cwd del proceso del nodo, por ejemplo
node myscript.mjs
funcionará peronode dir/myscript.mjs
no lo haré– Dan
10 sep 2021 a las 22:13
-
Este resolvió mi problema.
– Nilay Singh
5 de abril de 2022 a las 8:16
-
en realidad estaba tratando de arreglar
path.resolve(__dirname, "foo", "bar")
porque no me di cuenta de que de todos modos hará que la ruta sea relativa si solo pasa segmentos de ruta; simplemente puede omitir el__dirname
. ¡Gracias!– Codificador
18 de julio de 2022 a las 14:24
Por lo general, no es necesario importar desde ‘url’ o ‘ruta’.
Por ejemplo (usando ESM)
fs.readFileSync(new URL('myfile.txt', import.meta.url));
leerá myfile.txt desde el directorio del archivo JavaScript (no desde el directorio de trabajo actual).
-
Buena solución, pero no se siente muy clara para aquellos que no saben y/o no trabajan en un contexto de navegador donde el uso de URL parece un poco fuera de lugar. ¿Quizás podría ampliar cuándo esto podría ser particularmente apropiado?
– Dan
10 sep 2021 a las 22:03
-
Ok, parece que solo necesito actualizar mi pensamiento. path.resolve() solo devuelve cwd. Otros métodos son de largo aliento. El concepto de URL está integrado en los módulos ES6. Parece que este es el enfoque estándar ahora stackoverflow.com/a/66651120/4682556. ¡Gracias por esta respuesta!
– Dan
10 sep 2021 a las 22:11
-
Esto devuelve un
Buffer
si quieres una cadena usa:fs.readFileSync(new URL('myfile.txt', import.meta.url), 'utf-8');
– Michael Stramel
6 oct 2021 a las 22:27
-
¡Esto es increíble, gracias! Sin requisitos adicionales, sin trucos, a prueba de futuro.
–Tomás Kafka
19 de noviembre de 2021 a las 15:45
-
@Dan Sí, una URL se está volviendo más fiel a su nombre: Localizador Uniforme de Recursos. No se limita necesariamente a un recurso en la web.
– Константин Ван
10 de diciembre de 2022 a las 4:26
Una solución rápida (dependiendo de su proyecto) sería asegurarse de que "type": "module"
no existe en tu package.json
expediente
PUGAZHARASÁN
Obtuve esto del enlace de arriba
import express from 'express';
import path from 'path';
import { fileURLToPath } from 'url';
const app = express();
//we need to change up how __dirname is used for ES6 purposes
const __dirname = path.dirname(fileURLToPath(import.meta.url));
//now please load my static html and css files for my express app, from my /dist directory
app.use(express.static(path.join(__dirname ,'dist')));
//works...
¿Esto está en MJS o CJS? En el modo MJS, necesita una cuña, ya que funciona de manera diferente con
import
.– tadman
16 oct 2020 a las 6:23
documentación
– Jaromanda X
16 oct 2020 a las 6:27