fs.readFileSync nie jest zależny od pliku? Node.js


112

- Załóżmy, że w katalogu głównym projektu mam plik o nazwie „plik.xml”

-Załóżmy, że mam plik testowy w testach / o nazwie "test.js" i ma

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

Jeśli teraz uruchomię node ./tests/test.jsz katalogu głównego mojego projektu, pojawi się komunikat ../file.xml nie istnieje. Jeśli uruchomię to samo polecenie z katalogu tests, to zadziała.

Wygląda na to, że fs.readFileSync jest względne w stosunku do katalogu, z którego skrypt jest wywoływany, a nie do miejsca, w którym faktycznie się znajduje. Gdybym napisał fs.readFileSync("./file.xml")w pliku test.js, wyglądałoby to bardziej zagmatwane i nie jest spójne ze ścieżkami względnymi w instrukcji wymagania, które są względne dla pliku.

Dlaczego to?

Jak mogę uniknąć konieczności przepisywania ścieżek w moim fs.readFileSync?


4
__dirnameniekoniecznie jest tym samym, co bieżący katalog roboczy, ale fs.readFileSync()używa bieżącego katalogu roboczego. Bieżący katalog roboczy jest prawdopodobnie ustawiony na taki sam, jaki był w momencie uruchomienia node.
— jfriend00

Odpowiedzi:


195

Możesz rozwiązać ścieżkę względną względem lokalizacji pliku źródłowego - zamiast bieżącego katalogu - używając path.resolve:

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

1
Dziękuję Ci. To działa i mam ochotę to zaakceptować, ale masz pojęcie, dlaczego jest to potrzebne? Chciałbym móc wyjaśnić deweloperom w moim zespole, dlaczego ten dodatkowy krok nie jest konieczny w wymaganym oświadczeniu. Np. Gdybym miał moduł w katalogu głównym o nazwie module.js, potrzebowałbym tylko wymagania ("../ module.js") w test.js
— Arman

12
Ponieważ ścieżki względne są rozwiązywane przy użyciu bieżącego katalogu. Chcesz rozwiązać problem przy użyciu innego katalogu. Z dokumentów : „Można użyć względnej ścieżki do nazwy pliku. Pamiętaj jednak, że ta ścieżka będzie względna do process.cwd ()”.
— Cartant

z jakiegoś powodu przyszło mi do głowy, że ponieważ plik lokalny nie działa w moim zdalnym środowisku, które i. musiałby pobrać plik za pomocą pełnego adresu URL. Jednak oczywiście nie zrobiłem i mogłem użyć tej metody do rozwiązania ścieżki bezwzględnej na moim zdalnym serwerze ..
— weaveoftheride
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.