fs.readFileSync ist nicht dateirelativ? Node.js


103

- Angenommen, ich habe eine Datei im Stammverzeichnis meines Projekts mit dem Namen "file.xml".

- Angenommen, ich habe eine Testdatei in tests / mit dem Namen "test.js" und sie hat

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

Wenn ich jetzt node ./tests/test.jsvom Stammverzeichnis meines Projekts aus starte, heißt es, dass ../file.xml nicht existiert. Wenn ich denselben Befehl im Testverzeichnis ausführe, funktioniert er.

Es scheint, dass fs.readFileSync relativ zu dem Verzeichnis ist, aus dem das Skript aufgerufen wird, anstatt zu dem Verzeichnis, in dem sich das Skript tatsächlich befindet. Wenn ich fs.readFileSync("./file.xml")in test.js schreibe, sieht es verwirrender aus und stimmt nicht mit relativen Pfaden in einer require-Anweisung überein, die dateirelativ sind.

Warum ist das?

Wie kann ich vermeiden, dass die Pfade in meinem fs.readFileSync neu geschrieben werden müssen?


3
__dirnameist nicht unbedingt dasselbe wie das aktuelle Arbeitsverzeichnis, sondern fs.readFileSync()verwendet das aktuelle Arbeitsverzeichnis. Das aktuelle Arbeitsverzeichnis wird wahrscheinlich auf das eingestellt, was es war, als Sie den Knoten gestartet haben.
jfriend00

Antworten:


180

Sie können den Pfad relativ zum Speicherort der Quelldatei und nicht zum aktuellen Verzeichnis auflösen, indem Sie Folgendes verwenden path.resolve:

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

1
Vielen Dank. Das funktioniert und ich bin versucht, es zu akzeptieren, aber eine Idee, warum dies benötigt wird? Ich möchte den Entwicklern in meinem Team erklären können, warum der zusätzliche Schritt, da er in einer erforderlichen Erklärung nicht erforderlich ist. Beispiel: Wenn ich ein Modul im Stammverzeichnis namens module.js hätte, müsste ich nur ("../ module.js") in test.js
Arman

10
Weil relative Pfade unter Verwendung des aktuellen Verzeichnisses aufgelöst werden. Und Sie möchten mit einem anderen Verzeichnis auflösen. Aus den Dokumenten : "Der relative Pfad zu einem Dateinamen kann verwendet werden. Beachten Sie jedoch, dass dieser Pfad relativ zu process.cwd () ist."
Cartant

Aus irgendeinem Grund habe ich es mir in den Kopf gesetzt, dass ich, weil die lokale Datei in meiner Remote-Umgebung nicht funktionierte. müsste die Datei durch eine vollständige URL erhalten. Natürlich habe ich das nicht getan und konnte diese Methode verwenden, um den absoluten Pfad auf meinem Remote-Server
aufzulösen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.