Why is __dirname not defined in node REPL?
From the node manual I see that I can get the directory of a file with __dirname
, but from the REPL this seems to be undefined. Is this a misunderstanding on my side or where is the 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)
__dirname
is only defined in scripts. It's not available in REPL.
try make a script a.js
console.log(__dirname);
and run it:
node a.js
you will see __dirname
printed.
Added background explanation: __dirname
means 'The directory of this script'. In REPL, you don't have a script. Hence, __dirname
would not have any real meaning.
Building on the existing answers here, you could define this in your REPL:
__dirname = path.resolve(path.dirname(''));
Or:
__dirname = path.resolve();
If no
path
segments are passed,path.resolve()
will return the absolute path of the current working directory.
Or @Jthorpe's alternatives:
__dirname = process.cwd();
__dirname = fs.realpathSync('.');
__dirname = process.env.PWD
If you are using Node.js modules, __dirname
and __filename
don't exist.
From the Node.js documentation:
No require, exports, module.exports, __filename, __dirname
These CommonJS variables are not available in ES modules.
require
can be imported into an ES module usingmodule.createRequire()
.Equivalents of
__filename
and__dirname
can be created inside of each file viaimport.meta.url
:
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
In ES6 use:
import path from 'path';
const __dirname = path.resolve();
also available when node is called with --experimental-modules
As @qiao said, you can't use __dirname
in the node repl. However, if you need need this value in the console, you can use path.resolve()
or path.dirname()
. Although, path.dirname()
will just give you a "." so, probably not that helpful. Be sure to require('path')
.