Относительный путь для файла данных в модуле NodeJS - PullRequest
0 голосов
/ 24 апреля 2020

Я создал модуль 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. Когда мой текущий рабочий каталог находится на root модуля, это не проблема (тогда это будет ./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, но я знаю, что это неправильный подход ..

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

1 Ответ

2 голосов
/ 24 апреля 2020

Обычно вы создаете путь для каждого местоположения относительно каталога, в котором находится ваш код, и относитесь к нужному местоположению относительно него. Расположение вашего кода будет передано в модуль кода как __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 всегда будет полным путем к каталогу, из которого выполняется код вашего модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...