1

I created a NodeJS module, written in typescript (though it shouldn't change anything).

Here's how it's organized:

.
├── data/
│   └── MY_DATA_FILES.json
│
├── src/
│   ├── data/
│   │   └── data.ts
│   │
│   └── OTHER_TYPESCRIPT_FILES.ts
│
├── dist/
│   ├── data/
│   │   └── data.js
│   │
│   └── OTHER_JAVASCRIPT_FILES.ts
│
├── package.json
└── tsconfig.json

My goal is to read the data files from the data.ts file. When my current working directory in on the root of the module it's not a problem (then it would be ./data/...) but when I use this as a module, and it's placed in the nodes_modules/ directory, I'm not sure how to handle the situation.

I'm currently reading the files as follow:

import fs from 'fs';
const basePath = './data';
const filesPath = 'subdirectory/my_data.json';

export function getData(): any {
    const fileFullPath  = basePath + '/' + filesPath;
    const contents = fs.readFileSync(fileFullPath);

    // [...]
}

But here, my basePath is dependent on my working directory. I could set it as ./node_modules/my_module/data, but I know that's not the right approach..

Any help would be appreciated, thanks!

1 Answer 1

2

You would typically build a path for each location that is relative to the directory where your code is located and access the desired location in a relative way from that. The location of your code will be passed to the code's module as __dirname. You can then combine that relative path with __dirname to build a full path to the target location without making any assumptions about where or how the module is installed.

So, assuming your code is in the src directory, that would be where __dirname points to. To, get access to the data directory below the src directory, you would use:

let srcDataDir = path.join(__dirname, "data");

To get access to the dist/data directory, you would use:

let distDataDir = path.join(__dirname, '../dist/data');

To get access to the higher level data directory where MY_DATA_FILES.json is, you would use:

let topDataDir = path.join(__dirname, '../data');

As, you can see, the key is to build everything relative from the location you do know which is __dirname passed to the code as the location of the code's own directory.

In Javascript's modules, you don't ever want to make any assumptions about the current working directory because that can literally be anything. That's controlled by the top level program itself and how the program was started and is not anything the module itself can rely on or make assumptions about. But __dirname will always be the full path to the directory where your module's code is running from.

Sign up to request clarification or add additional context in comments.

1 Comment

Exactly what I needed, I didn't know about __dirname. Thanks a bunch!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.