node.js - not - nodo__dirname no definido
path node js (6)
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 del nombre dir, no una línea inferior ( __dirname
no _dirname).
http://nodejs.org/docs/latest/api/globals.html#globals_dirname
Del manual del nodo veo que puedo obtener el directorio de un archivo con __dirname
, pero desde el REPL esto parece estar indefinido. ¿Es esto un malentendido de mi parte 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.<anonymous> (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.<anonymous> (readline.js:82:12)
at ReadStream.emit (events.js:88:20)
at ReadStream._emitKey (tty.js:320:10)
Como dijo @qiao, no puedes usar __dirname
en el nodo repl. Sin embargo, si necesita este valor en la consola, puede usar path.resolve()
o path.dirname()
. Aunque, path.dirname()
solo le dará un "." entonces, probablemente no tan útil. Asegúrese de require(''path'')
.
Estaba ejecutando una secuencia de comandos del archivo por lotes como usuario del sistema y todas las variables como process.cwd()
, path.resolve()
y todos los demás métodos me daría una ruta a la carpeta C: / Windows / System32 en lugar de la ruta real. Durante los experimentos, noté que cuando se produce un error, la pila contiene una ruta real al archivo de nodo.
Aquí hay una forma muy rara de obtener un verdadero camino desencadenando un error y extrayendo 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();
Parece que también podrías hacer esto:
__dirname=fs.realpathSync(''.'');
por supuesto, no olvides fs=require(''fs'')
(no es realmente global en las secuencias de comandos de nodo exactamente, solo se define en el nivel de módulo)
Sobre la base de las respuestas existentes aquí, puede definir esto en su REPL:
__dirname = path.resolve(path.dirname(''''));
O:
__dirname = path.resolve();
O las alternativas de @Jthorpe:
__dirname = process.cwd();
__dirname = fs.realpathSync(''.'');
__dirname = process.env.PWD
__dirname
solo se define en los scripts. No está disponible en REPL.
intente hacer un script a.js
console.log(__dirname);
y ejecutarlo:
node a.js
verá __dirname
impreso.
Explicación de fondo __dirname
: __dirname
significa ''El directorio de este script''. En REPL, no tienes un script. Por lo tanto, __dirname
no tendría ningún significado real.