Относительный путь к файлу данных в модуле NodeJS

Я создал модуль NodeJS, написанный на машинописном тексте (правда, он ничего не должен менять).

Вот как это устроено:

.
├── 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

Моя цель - прочитать файлы данных из data.ts файла. Когда мой текущий рабочий каталог находится в корне модуля, это не проблема (тогда это будет ./data/...), но когда я использую его как модуль, и он помещается в каталог nodes_modules/, я не уверен, как справиться с ситуацией. .

В настоящее время я читаю следующие файлы:

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);

    // [...]
}

Но здесь мой basePath зависит от моего рабочего каталога. Я мог бы установить его как ./node_modules/my_module/data, но я знаю, что это неправильный подход ..

Любая помощь будет оценена, спасибо!


person Zorzi    schedule 24.04.2020    source источник


Ответы (1)


Обычно вы создаете путь для каждого местоположения, относительное к каталогу, в котором находится ваш код, и получаете доступ к желаемому местоположению относительным образом от этого. Местоположение вашего кода будет передано модулю кода как __dirname. Затем вы можете объединить этот относительный путь с __dirname, чтобы построить полный путь к целевому местоположению, не делая никаких предположений о том, где и как установлен модуль.

Итак, если ваш код находится в каталоге src, это будет то место, куда указывает __dirname. Чтобы получить доступ к каталогу data под каталогом src, вы должны использовать:

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

Чтобы получить доступ к каталогу dist/data, вы должны использовать:

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

Чтобы получить доступ к каталогу данных более высокого уровня, где находится MY_DATA_FILES.json, вы должны использовать:

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

Как видите, ключевым моментом является построение всего относительного, исходя из того местоположения, которое вы знаете, которое __dirname передается коду в качестве местоположения собственного каталога кода.

В модулях Javascript вы никогда не захотите делать какие-либо предположения о текущем рабочем каталоге, потому что это может быть буквально что угодно. Это контролируется самой программой верхнего уровня и тем, как программа была запущена, и это не то, на что сам модуль может полагаться или делать предположения. Но __dirname всегда будет полным путем к каталогу, из которого выполняется код вашего модуля.

person jfriend00    schedule 24.04.2020
comment
Именно то, что мне было нужно, я не знал о __dirname. Огромное спасибо! - person Zorzi; 24.04.2020