What is the difference between __dirname and ./ in node.js? - Printable Version +- 0Day Forums (https://0day.red) +-- Forum: Coding (https://0day.red/Forum-Coding) +--- Forum: NodeJs (https://0day.red/Forum-NodeJs) +--- Thread: What is the difference between __dirname and ./ in node.js? (/Thread-What-is-the-difference-between-dirname-and-in-node-js) |
What is the difference between __dirname and ./ in node.js? - forestry785 - 07-21-2023 When programming in Node.js and referencing files that are located somewhere in relation to your current directory, is there any reason to use the `__dirname` variable instead of just a regular `./`? I've been using ./ thus far in my code and just discovered the existence of `__dirname`, and essentially want to know whether it would be smart to convert my ./'s to that, and if so, why that would be a smart idea. RE: What is the difference between __dirname and ./ in node.js? - calendars216272 - 07-21-2023 `./` refers to the current working directory, except in the `require()` function. When using `require()`, it translates `./` to the directory of the current file called. `__dirname` is always the directory of the current file. For example, with the following file structure `/home/user/dir/files/config.json` { "hello": "world" } `/home/user/dir/files/somefile.txt` text file `/home/user/dir/dir.js` var fs = require('fs'); console.log(require('./files/config.json')); console.log(fs.readFileSync('./files/somefile.txt', 'utf8')); If I `cd` into `/home/user/dir` and run `node dir.js` I will get { hello: 'world' } text file But when I run the same script from `/home/user/` I get { hello: 'world' } Error: ENOENT, no such file or directory './files/somefile.txt' at Object.openSync (fs.js:228:18) at Object.readFileSync (fs.js:119:15) at Object.<anonymous> (/home/user/dir/dir.js:4:16) at Module._compile (module.js:432:26) at Object..js (module.js:450:10) at Module.load (module.js:351:31) at Function._load (module.js:310:12) at Array.0 (module.js:470:10) at EventEmitter._tickCallback (node.js:192:40) Using `./` worked with `require` but not for `fs.readFileSync`. That's because for `fs.readFileSync`, `./` translates into the cwd (in this case `/home/user/`). And `/home/user/files/somefile.txt` does not exist. RE: What is the difference between __dirname and ./ in node.js? - outfight202 - 07-21-2023 # The gist In Node.js, `__dirname` is always the directory in which the currently executing script resides ([see this][1]). So if you typed `__dirname` into `/d1/d2/myscript.js`, the value would be `/d1/d2`. By contrast, `.` gives you the directory from which you ran the `node` command in your terminal window (i.e. your working directory) when you use libraries like `path` and `fs`. Technically, it starts out as your working directory but can be changed using `process.chdir()`. The exception is when you use `.` with `require()`. The path inside `require` is always relative to the file containing the call to `require`. # For example... Let's say your directory structure is /dir1 /dir2 pathtest.js and `pathtest.js` contains var path = require("path"); console.log(". = %s", path.resolve(".")); console.log("__dirname = %s", path.resolve(__dirname)); and you do cd /dir1/dir2 node pathtest.js you get . = /dir1/dir2 __dirname = /dir1/dir2 Your working directory is `/dir1/dir2` so that's what `.` resolves to. Since `pathtest.js` is located in `/dir1/dir2` that's what `__dirname` resolves to as well. However, if you run the script from `/dir1` cd /dir1 node dir2/pathtest.js you get . = /dir1 __dirname = /dir1/dir2 In that case, your working directory was `/dir1` so that's what `.` resolved to, but `__dirname` still resolves to `/dir1/dir2`. ### Using `.` inside `require`... If inside `dir2/pathtest.js` you have a `require` call into include a file inside `dir1` you would **always** do require('../thefile') because the path inside `require` is always relative to the file in which you are calling it. It has nothing to do with your working directory. [1]: [To see links please register here] |