2016-07-25 2 views
3

Ich schreibe eine einfache Anwendung in node.js, aus irgendeinem Grund bekomme ich den Fehler "TypeError: Pfad muss absolut sein oder angeben root res.sendFile" wenn versuchen, meine HTML-Seite zu dienen. Dieser Fehler sollte nicht auftreten, da ich eine Express-Middleware verwendet habe, die den Ordner angibt, in dem diese Datei gefunden werden kann. Warum bekomme ich dieses Problem?Node.js Anwendung nicht statische Webpage ohne Root-Pfad

Meine app Struktur sieht wie folgt aus

MyApp 
    public 
     login.html 
    app.js 

Meine HTML-Seite in app.js wie diese

var express = require("express"); 
var app = express(); 

app.use(express.static("public")); 

app.get('/', function(req, res){ 
    res.sendFile("login.html"); 
}); 

app.listen(3000); 

serviert wird Ich weiß, dies zu umgehen, was ich tun kann „res.sendFile (__dirname + '/ public/login.html'); " Stattdessen sollte ich es nicht tun, da ich eine Middleware verwende. Irgendwelche Ideen?

+0

Das ist etwas verwirrend, erwarten Sie, dass Node in den Ordner "public" schauen sollte, wenn Sie 'sendFile()' einen Dateinamen geben? Es werden nicht nur statische Dateien beim direkten Zugriff geladen, daher der Name "statisch". – adeneo

+0

Was ist dein Betriebssystem? –

+0

@adeneo Ja, ich erwarte, dass es im öffentlichen Ordner aussieht, da login.html statisch ist. – OneMoreQuestion

Antwort

0

Diese Linie

app.use(express.static("public")); 

nicht tut, was Sie denken, es tut!

Es tut nicht legen Sie den Standardordner für jede Knotenfunktion, in der Tat tut es nichts für andere Knotenfunktionen.

Es sagt einfach, dass, wenn der Webserver eine Anfrage erhält, suchen Sie zuerst in diesem Ordner, um zu sehen, ob eine solche Datei existiert, und wenn ja, diene diese Datei.

Daher ist es eine Route für statische Dateien, am häufigsten für CSS- und JavaScript-Dateien verwendet, und natürlich jede andere statische Datei, die keinen dynamischen Inhalt liefert.

jedoch diese Linie

res.sendFile("login.html"); 

für die Datei Sieht login.html im aktuellen Arbeitsverzeichnis, oder in anderen Worten, wenn Sie Knoten Skript sind ausgeführt wird, es hat gar nichts mit dem zu tun, statische Route, die richtige Art und Weise in der Tat, dass die Datei zu erhalten, unabhängig davon, wo Sie Ihr Skript, läuft genau

res.sendFile(__dirname + '/public/login.html'); 

zu tun, als dass der richtige Weg ist, die für sendFile benötigt, um die Datei zu finden.

+0

warten ist Login.html keine statische Datei? – OneMoreQuestion

+0

@OneMoreQuestion - es ist sicher, wenn Sie es wie "http: // mywebsite/login.html" zugreifen, können Sie es sogar mit einer statischen ** Route ** bekommen, aber das macht 'sendFile' plötzlich nicht mit arbeiten diese statische Route, die für den Webserver * eingerichtet wurde. Da die statische Route nichts mit den anderen Funktionen in Node zu tun hat, kann der Webserver nur statische Dateien an den Browser senden. – adeneo

+0

sagst du, dass "sendFile" nicht der richtige Ansatz ist, wenn ich eine Middleware verwenden möchte, habe ich auch "render" versucht, aber dann laufe ich in View Engine Rendering Problem. Gibt es einen besseren Weg, wenn ich die Middleware nutzen möchte? – OneMoreQuestion

0

Add-Funktion, die Sie den vollständigen Pfad, nennen wir diese Funktion $

var $=(file)=>`${__dirname}/public/${file}`; 

Dann gibt: Weg

res.sendFile($("login.html")); 

Damit werden Sie nicht brauchen, um umfassen root manuell für jede sendFile Anruf .