Heim >Web-Frontend >js-Tutorial >So lösen Sie das NodeJS-Pfadproblem
Dieser Artikel stellt hauptsächlich die Lösung des Nodejs-Pfadproblems vor. Der Inhalt ist ziemlich gut, ich werde ihn jetzt mit Ihnen teilen und als Referenz geben.
Ein aktuelles Entwicklungsprojekt des Unternehmens verwendete NodeJS als Backend. In den letzten zwei Tagen musste ich es für eine Kundendemonstration verpacken, also habe ich einen Mitarbeiter des Unternehmens gebeten, das Verpackungswerkzeug aus dem vorherigen 3D-Computerraum zu verpflanzen. Nach dem Packen stellte ich fest, dass auf das Projekt, das ursprünglich in der Entwicklungsumgebung gut lief, nicht mehr zugegriffen werden konnte. Es besteht das Problem, dass auf die Homepage des Projekts nicht zugegriffen werden kann:
Datei index.html kann nicht abgerufen werden
Express .static
Was ist das Problem?
Das NodeJS-Backend verwendet Express und index.html ist eine statische Datei. Wir wissen, dass statische Dateien wie Bilder, CSS, JavaScript-Dateien usw. problemlos über die integrierte express.static von Express gehostet werden können.
Die Übergabe des Verzeichnisses, in dem sich die statischen Ressourcendateien befinden, als Parameter an die express.static-Middleware kann Zugriff auf statische Ressourcendateien ermöglichen. Angenommen, Bilder, CSS- und JavaScript-Dateien werden im öffentlichen Verzeichnis abgelegt, können Sie den folgenden Code verwenden:
app.use(express.static('public'));
Suchen Sie also den Code im Projekt und überprüfen Sie, wo static aufgerufen wird Ähnlich wie in der obigen Codezeile:
app.use(express.static('public'));
An diesem Punkt habe ich das Problem entdeckt und meinen Freunden gesagt, dass dieses Problem ohne die Verwendung relativer Pfade gelöst werden kann. Aufgrund der Verpackungsfrist habe ich meine Freunde gebeten, sich zunächst kurz darum zu kümmern. Nachdem ich mit dem Verpacken fertig bin, werde ich meine Gedanken ordnen:
app.use(express.static('resource/public'));
Das Wichtigste ist natürlich, dass dieses Problem tatsächlich besteht Wenn Sie mehr alleine lernen, wird es sehr einfach sein, das Problem zu finden, also wird dieses Problem nicht auftreten, also machen Sie es bitte selbst.
Nun, Sie haben richtig gelesen, dieser Ort ist immer noch ein relatives Verzeichnis. Die Situation wird in späteren Produkten verbessert.
Express.static-Methodenanalyse
Wenn die express.static-Methode tatsächlich einen relativen Pfad übergibt, konvertiert Express sie selbst Für einen absoluten Pfad können wir den Quellcode überprüfen und den folgenden Code in express.js finden:
exports.static = require('serve-static');
Beschreibung static ruft das Serve-Static-Paket auf, finden Sie dieses Paket direkt, überprüfen Sie index.js, Sie können sehen Im Code sind die beiden wichtigen Zeilen
... var resolve = require('path').resolve ... opts.root = resolve(root) ...
aufgeführt. Diese beiden Zeilen sind der Code zum Konvertieren eines relativen Verzeichnisses in ein absolutes Verzeichnis. Es ist ersichtlich, dass es sich um die Auflösungsmethode des integrierten Objekts handelt Der Pfad wird letztendlich verwendet.
Methode des Pfadobjekts auflösen
Sehen Sie sich die API-Dokumentation dieser Methode direkt wie folgt an: https://nodejs.org/api /path .html#path_path_resolve_paths
Hier ist eine Erklärung dieser Methode:
Die Methode path.resolve() löst eine Folge von Pfaden oder Pfadsegmenten auf in einen absoluten Weg.
Was bedeutet das? Diese Methode organisiert eine Reihe von Pfaden oder Pfadsegmenten in einem absoluten Pfad, z. B.
path.resolve('/foo','bar'); // return /foo/bar
Detaillierte Anweisungen finden Sie in der Dokumentation. Hier gibt es einen Satz, der besondere Aufmerksamkeit erfordert:
Wenn nach der Verarbeitung aller angegebenen Pfadsegmente noch kein absoluter Pfad generiert wurde, wird das aktuelle Arbeitsverzeichnis verwendet.
Was bedeutet es, wenn alle Pfadsegmente verarbeitet wurden und kein absoluter Pfad generiert wird, muss das aktuelle Arbeitsverzeichnis verwendet werden. Zum Beispiel:
path.resolve('bar'); // 加上 /Users/terry 是当前工作目录, return /Users/terry/bar
Ein komplexeres Beispiel im API-Dokument (beachten Sie hier beim Auflösen, von rechts nach links, siehe Dokument für Details):
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'); // if the current working directory is /home/myself/node, // this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'
Die Frage ist nun, was ist das aktuelle Arbeitsverzeichnis.
nodejs aktuelles Arbeitsverzeichnis aktuelles Arbeitsverzeichnis
nodejs Das aktuelle Arbeitsverzeichnis ist das Verzeichnis, in dem Node gestartet wird. Mit anderen Worten: Das Verzeichnis, von dem aus Sie den Startknoten betreten, kehrt zu diesem Verzeichnis zurück.
Beachten Sie, dass sich dieses Verzeichnis nicht auf das Verzeichnis bezieht, in dem sich die js-Datei befindet.
Das aktuelle Arbeitsverzeichnis kann über die Methode „process.cwd()“ abgerufen werden.
Das Folgende ist ein Beispiel zur Einführung des aktuellen Arbeitsverzeichnisses. Wenn Sie eine js-Datei, test.js, im Verzeichnis /Users/terry/Documents/JSWorkspace schreiben, gibt es nur eine Zeile Code:
console.log(process.cwd());
Wenn Sie zu diesem Zeitpunkt den Befehl im Verzeichnis /Users/terry/Documents/JSWorkspace: node test.js ausführen, lautet die Ausgabe wie folgt:
/Users/terry/Documents/JSWorkspace
Aber wenn Sie führen den Befehl im Verzeichnis /Users/terry/Documents/ aus: Knoten ./JSWorkspace/test.js. Das Ausgabeergebnis lautet:
/Users/terry/Documents
Daher können Sie sehen, in welchem Verzeichnis Sie den Knotenbefehl ausführen. und das aktuelle Verzeichnis ist dieses Verzeichnis.
Zurück zum vorherigen Verpackungsproblem, da in der Entwicklungsphase der Knotenbefehl im Allgemeinen direkt in dem Verzeichnis ausgeführt wird, in dem sich die js-Datei befindet, sodass das Schreiben des relativen Verzeichnisses relativ kein Problem darstellt in das Verzeichnis der aktuellen js-Datei.
Aber nach dem Packen wird die Ausführung des Knotens in der oberen Ebene des js-Verzeichnisses platziert. Zu diesem Zeitpunkt ist das relative Verzeichnis „public“ nicht mehr relativ zur js-Datei, sondern relativ zur vorherigen Ebene. Dieser Ordner kann daher nicht gefunden werden, und daher kann die Datei index.html nicht gefunden werden.
So lösen Sie
Lösung:
1.在前面已经说过了,改这个相对目录。但这种方法很蹩脚。因为,启动node命令的目录可能会变;而是如果这应该,开发阶段的node命令执行也需要跟着改。 总之不是兼容性很好的方法。
2.直接使用绝对路径。 但是这个绝对路径在不同的机器上又不一样,该如何解决呢?可以考虑使用全局变量__dirname.
全局变量__dirname
查看api文档 https://nodejs.org/api/modules.html#modules_dirname
看到解释如下:
The directory name of the current module. This is the same as the path.dirname() of the __filename。
啥意思呢,及时返回nodejs 的js文件的所在目录。
有了这个变量之后,我们就可以用如下代码解决这个问题。
app.use(express.static(__dirname + '/public'));
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Das obige ist der detaillierte Inhalt vonSo lösen Sie das NodeJS-Pfadproblem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!