fs.readFileSync не є відносним файлом? Node.js


112

-Припустимо, у мене є файл у корені мого проекту під назвою "file.xml"

-Припустимо, у мене є файл тесту в тестах, який називається "test.js", і він є

const file = fs.readFileSync("../file.xml");

Якщо я зараз запускаю node ./tests/test.jsз кореня мого проекту, він говорить ../file.xml не існує. Якщо я запускаю ту саму команду з каталогу тестів, це працює.

Здається, fs.readFileSync є відносно каталогу, з якого викликається скрипт, замість того, де скрипт насправді. Якби я писав fs.readFileSync("./file.xml")у test.js, це виглядало б більш заплутаним і не узгоджувалось із відносними шляхами в операторі require, які є відносними до файлу.

Чому це?

Як мені уникнути необхідності переписувати шляхи у моєму fs.readFileSync?


4
__dirnameне обов'язково збігається з поточним робочим каталогом, але fs.readFileSync()використовує поточний робочий каталог. Поточний робочий каталог, ймовірно, встановлений таким, яким він був під час запуску вузла.
— jfriend00

Відповіді:


195

Ви можете визначити шлях відносно розташування вихідного файлу, а не поточного каталогу, використовуючи path.resolve:

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));

1
Дякую. Це працює, і я маю спокусу прийняти це, але будь-яка ідея, навіщо це потрібно? Я хотів би мати можливість пояснити розробникам моєї команди, чому цей додатковий крок, оскільки це не потрібно в заяві require. Приклад: якщо у мене був модуль у кореневому каталозі, який називається module.js, мені потрібно було б лише вимагати ("../ module.js") у test.js
— Арман,

12
Оскільки відносні шляхи вирішуються за допомогою поточного каталогу. І ви хочете вирішити проблему, використовуючи інший каталог. З документації : "Можна використовувати відносний шлях до імені файлу. Однак пам’ятайте, що цей шлях буде відносно process.cwd ()."
— евакуатор

чомусь я зрозумів це, оскільки локальний файл не працював у моєму віддаленому середовищі, що я. потрібно було б отримати файл за повною URL-адресою. Однак, звичайно , я не зробив , і я був в змозі використати цей метод , щоб вирішити абсолютний шлях на моєму віддаленому сервері ..
— weaveoftheride
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.