2012-11-18 22 views
6

Ich habe eine Node.js-Datei namens "server.js".Ausführen von Node.js Datei von außerhalb des Ordners bricht Dateipfad

Im Skript öffne ich einige Dateien mit so etwas wie:

var certPem = fs.readFileSync('cert_and_key_dev.pem', encoding='ascii'); 

Unter Verwendung des Bash-Shell, wenn ich cd in das Verzeichnis, in dem der server.js ist, und den Befehl ausführen:

[mybashshell] $ Knoten server.js

Es funktioniert, ich habe keinen Fehler. Der Server wird gestartet und ausgeführt.

Wenn ich jetzt aus dem Verzeichnis, in dem sich die server.js-Datei befindet, cd, dann führen Sie den gleichen Shell-Befehl erneut aus, um meinen Server zu starten.

Es beschwert sich über meinen Dateipfad zu meinem "cert_and_key_dev.pem" gebrochen wird.

Ich hatte nicht erwartet, dass so etwas passiert. Der Pfad, der in der Skriptdatei verwendet wird, sollte relativ zur Skriptdatei sein, nicht zu dem Ort, an dem ich meinen bash shell Befehl ausgeführt habe.

Irgendwelche Ideen?

Antwort

13

Setzen Sie dies am Anfang Ihres Skripts.

process.chdir(__dirname); 

Dies wird das Arbeitsverzeichnis in den Verzeichnispfad der Datei (__dirname) des Prozesses ändern ausgeführt wird.

Weitere Informationen zur Funktion lesen Sie this.

+0

Gibt es irgendwelche Vorteile zwischen dieser Methode und der von chbrown angegebenen Methode? Ich bin gespannt, welcher der richtige Weg ist. – Zhang

+0

Es hängt wirklich vom Zweck ab. Wenn Sie mehr von einem "Server" ausführen, würde ich vorschlagen, in "__dirname" zu ändern. Wenn Sie zum Beispiel ein Ordner-Upload-Skript ausführen, würde ich vorschlagen, den Code von chbrawn zu verwenden. Sie müssen abwägen, wie oft Sie den aktuellen Arbeitsverzeichnispfad über den Verzeichnispfad des aktuellen Skripts verwenden möchten. –

7

Oder

var path = require('path'); 
var key = path.join(__dirname, 'cert_and_key_dev.pem'); 
var certPem = fs.readFileSync(key, encoding='ascii'); 

Wenn Sie nicht wollen, zu cd welchem ​​Grund auch immer.

+0

LOL, danke Leute, sie arbeiten beide, aber ich weiß nicht, welchen ich annehmen soll, ich möchte beide Antworten geben. Ich werde es Julian Lannigan geben, da er zuerst geantwortet hat und den Rep-Boost benutzen konnte (hoffe, dass du nichts gegen Chbrown hast). – Zhang

+1

Im Zweifel gewinnt der weniger Code. Wenn Sie nicht wissen müssen, von welchem ​​Verzeichnis Sie Ihr Skript gestartet haben, ist Julians Antwort besser. – chbrown

+0

Aber erinnern Sie sich an Zhang, dass Sie das aktuelle Arbeitsverzeichnis immer in einer Variablen speichern können, bevor Sie es ändern. Rufen Sie 'process.cwd()' auf –

Verwandte Themen