How to Use __dirname in Node.js

While this tutorial has content that we believe is of great benefit to our community, we have not yet tested or edited it to ensure you have an error-free learning experience. It's on our list, and we're working on it! You can help us out by using the "report an issue" button at the bottom of the tutorial.

The double underscores in __dirname looks intimidating but it’s not! It’s a useful variable that’s been around since the beginnging of the NodeJS project. Why’s it such a core feature of Node.js? __dirname tells you the absolute path of the directory containing the currently executing file.

Here’s a simple example:

  │  ├──helpers.js
  │  └──api
  │      └──crocodile.js
  │  ├──swamp-pix
  │  └──get-latest-gators.js
console.log(__dirname)      // "/Users/Sam/gator-app/src/api"
console.log(process.cwd())  // "/Users/Sam/gator-app"
console.log(__dirname)     // "/Users/Sam/gator-app/cronjobs"
console.log(process.cwd()) // "/Users/Sam/gator-app"

If you noticed, __dirname has a different value depending on which file you invoked it in, whereas process.cwd() (another popular Node.js utility) is different. It always returns the same value: the absolute path of where you started the Node.js process (eg., $ node index.js).

When Should I Use It?

__dirname is useful when you want to know the immediate containing folder. You may want to get this path for several reasons:

Making new directories

const fs = require('fs');
const path = require('path');
const dirPath = path.join(__dirname, '/swamp-pix');

fs.mkdirSync(dirPath); // sibling directory was created named "swamp-pix"

Pointing to directories

express.static(path.join(__dirname, '/public'));

Adding files to a directory

const fs = require('fs');
const path = require('path');
const filePath = path.join(__dirname, '/swamp-pix/bayou.jpeg');

fs.openSync(filePath, 'a'); // creates file if it doesn't exist

Once you get familiar with Node.js, interacting with your filesystem is easy when you use __dirname.

Plus, __dirname is a global object that’s available to use in all your Node.js modules, without having to import anything. That’s because Node modules get wrapped when executed and given access to a series of global objects.


Creative Commons License