nodo __dirname no definido

Desde el manual del nodo veo que puedo obtener el directorio de un archivo con __dirname , pero desde el REPL esto parece no estar definido. ¿Es esto un malentendido de mi lado o dónde está el error?

 $ node > console.log(__dirname) ReferenceError: __dirname is not defined at repl:1:14 at REPLServer.eval (repl.js:80:21) at Interface. (repl.js:182:12) at Interface.emit (events.js:67:17) at Interface._onLine (readline.js:162:10) at Interface._line (readline.js:426:8) at Interface._ttyWrite (readline.js:603:14) at ReadStream. (readline.js:82:12) at ReadStream.emit (events.js:88:20) at ReadStream._emitKey (tty.js:320:10) 

__dirname solo se define en scripts. No está disponible en REPL.

intenta hacer un script a.js

 console.log(__dirname); 

y ejecutarlo:

 node a.js 

Verás __dirname impreso.

Se agregó una explicación de fondo: __dirname significa ‘El directorio de este script’. En REPL, no tienes un script. Por lo tanto, __dirname no tendría ningún significado real.

Sobre la base de las respuestas existentes aquí, podría definir esto en su REPL:

 __dirname = path.resolve(path.dirname('')); 

O:

 __dirname = path.resolve(); 

Si no se pasan segmentos de path , path.resolve() devolverá la ruta absoluta del directorio de trabajo actual.


O las alternativas de @Jthorpe:

 __dirname = process.cwd(); __dirname = fs.realpathSync('.'); __dirname = process.env.PWD 

Como dijo @qiao, no puedes usar __dirname en la __dirname del nodo. Sin embargo, si necesita necesitar este valor en la consola, puede usar path.resolve() o path.dirname() . Aunque, path.dirname() solo te dará un “.” así que, probablemente no sea tan útil. Asegúrese de require('path') .

Parece que también podrías hacer esto:

 __dirname=fs.realpathSync('.'); 

por supuesto, no olvide fs=require('fs')

(No es realmente global en los scripts de nodos, simplemente se define en el nivel del módulo)

Aunque no es la solución a este problema, me gustaría agregarlo ya que puede ayudar a otros.

Debería tener dos guiones bajos antes de dirname, no uno debajo de la palabra ( __dirname no _dirname).

http://nodejs.org/docs/latest/api/globals.html#globals_dirname

Estaba ejecutando una secuencia de comandos de un archivo por lotes como usuario del SISTEMA y todas las variables como process.cwd() , path.resolve() y todos los otros métodos me darían la ruta a la carpeta C: \ Windows \ System32 en lugar de la ruta real. Durante los experimentos, noté que cuando se produce un error, la stack contiene una ruta real al archivo de nodo.

Aquí hay una manera muy intrincada de obtener la ruta verdadera al desencadenar un error y extraer la ruta de e.stack. No utilice.

 // this should be the name of currently executed file const currentFilename = 'index.js'; function veryHackyGetFolder() { try { throw new Error(); } catch(e) { const fullMsg = e.stack.toString(); const beginning = fullMsg.indexOf('file:///') + 8; const end = fullMsg.indexOf('\/' + currentFilename); const dir = fullMsg.substr(beginning, end - beginning).replace(/\//g, '\\'); return dir; } } 

Uso

 const dir = veryHackyGetFolder();