从节点手册中,我看到我可以用__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)
在现有答案的基础上,你可以在你的REPL中定义这个:
__dirname = path.resolve(path.dirname(''));
Or:
__dirname = path.resolve();
如果没有传递路径段,path.resolve()将返回当前工作目录的绝对路径。
或者@Jthorpe的替代方案:
__dirname = process.cwd();
__dirname = fs.realpathSync('.');
__dirname = process.env.PWD
如果你正在使用Node.js模块,__dirname和__filename不存在。
来自Node.js文档:
不需要,导出,模块。导出,__filename, __dirname
这些CommonJS变量在ES模块中不可用。
require可以使用module. createrequire()导入ES模块。
可以通过import.meta.url在每个文件中创建__filename和__dirname的等价物:
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
https://nodejs.org/docs/latest-v15.x/api/esm.html#esm_no_filename_or_dirname