节点__dirname未定义
从节点手册我看到,我可以用__dirname
获取文件的目录,但从REPL这似乎是未定义的。 这是我的误解还是错误?
$ 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)
__dirname
仅在脚本中定义。 这在REPL中不可用。
尝试制作一个脚本a.js
console.log(__dirname);
并运行它:
node a.js
你会看到__dirname
打印。
增加了后台说明: __dirname
表示“这个脚本的目录”。 在REPL中,你没有脚本。 因此, __dirname
没有任何实际意义。
基于现有的答案,你可以在你的REPL中定义这个:
__dirname = path.resolve(path.dirname(''));
要么:
__dirname = path.resolve();
如果没有path段被传递,path.resolve()将返回当前工作目录的绝对path。
或@ Jthorpe的替代品:
__dirname = process.cwd(); __dirname = fs.realpathSync('.'); __dirname = process.env.PWD
正如@桥所说,你不能在节点repl中使用__dirname
。 但是,如果您需要在控制台中需要此值,则可以使用path.resolve()
或path.dirname()
。 虽然, path.dirname()
只会给你一个“。” 所以,可能不是那么有用。 一定require('path')
。
虽然它不是解决这个问题的方法,但我想补充一点,因为它可以帮助别人。
在dirname之前应该有两个下划线 , 而不是一个下划线 ( __dirname
不是_dirname)。
http://nodejs.org/docs/latest/api/globals.html#globals_dirname
似乎你也可以这样做:
__dirname=fs.realpathSync('.');
当然,不要忘记fs=require('fs')
(在节点脚本中并不是真的全局的,它只是在模块级定义的)