2012-01-11 10 views
69

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

$ 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) 

Respuesta

112

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

tratar de hacer un script a.js

console.log(__dirname); 

y ejecutarlo:

node a.js 

verá __dirname impresa.

Explicación de fondo adicional: __dirname significa 'El directorio de este script'. En REPL, no tienes un script. Por lo tanto, __dirname no tendría ningún significado real.

+4

También usted no puede utilizar algunas de las variables globales dentro de los módulos RequireJS. Si usa RequireJS en el lado del servidor, consulte http://stackoverflow.com/questions/9027429/how-to-use-nodejs-global-module-objects-in-requirejs-modules. – Eye

+0

Sí, eso realmente debería agregarse a la respuesta Eye, porque eso es lo que me atrapó. –

+2

No agregar eso en el script de carga de REPL es desagradable. No puedo pensar en ninguna razón por la que no estaría allí ... – jcollum

5

Como dijo @qiao, no puede 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').

45

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

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

O:

__dirname = path.resolve(); 

If no path segments are passed, path.resolve() will return the absolute path of the current working directory.


O @ Jthorpe de Alabama ternatives:

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

si usa 'nesh' puede definir esto como parte de su script de carga; es ingenioso – jcollum

+1

o '__dirname = process.cwd()' o '__dirname = fs.realpathSync ('.')' o '__dirname = process.env.PWD' – Jthorpe

+1

' path.dirname' parece no aceptar valores que no sean cadenas en la versión más reciente, '6.0.0', por lo que la primera sugerencia en esta respuesta no funcionará. – trysis

2

parece que también se puede hacer esto:

__dirname=fs.realpathSync('.'); 

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

(que no es realmente global en guiones nodo exactamente, es sólo definido en el módulo nivel)

2

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

usted debe tener dos guiones antes de nombredir, ninguno undersore (__dirname no _dirname).

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

+0

__dirname (con dos guiones bajos) no funciona en el REPL –