Wenn ich a mache
res.sendfile('public/index1.html');
dann bekomme ich eine Serverkonsolenwarnung
Express veraltet
res.sendfile
: Verwenden Sieres.sendFile
stattdessen
aber es funktioniert gut auf der Client-Seite.
Aber wenn ich es ändere
res.sendFile('public/index1.html');
Ich bekomme eine Fehlermeldung
TypeError: Pfad muss absolut sein oder root angeben
res.sendFile
und index1.html
wird nicht gerendert.
Ich kann nicht herausfinden, was der absolute Weg ist. Ich habe public
Verzeichnis auf der gleichen Ebene wie server.js
. Ich mache das res.sendFile
von mit server.js
. Ich habe auch erklärtapp.use(express.static(path.join(__dirname, 'public')));
Hinzufügen meiner Verzeichnisstruktur:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
Was ist der absolute Pfad, der hier angegeben werden muss?
Ich benutze Express 4.x.
express.static
Warum müssen Sieres.sendFile
senden, wenn Sie die Middleware für Ihr öffentliches Verzeichnis verwendenpublic/index1.html
?res.sendFile
von innenapp.get('/', function(req, res){res.sendFile("...")})
an, um es auf Anfrage zu senden.Antworten:
Die
express.static
Middleware ist von getrenntres.sendFile
, sodass das Initialisieren mit einem absoluten Pfad zu Ihrempublic
Verzeichnis nichts bewirktres.sendFile
. Sie müssen einen absoluten Pfad direkt mit verwendenres.sendFile
. Es gibt zwei einfache Möglichkeiten:res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Hinweis:
__dirname
Gibt das Verzeichnis zurück, in dem sich das aktuell ausgeführte Skript befindet. In Ihrem Fall sieht es so aus, als observer.js
es sich in befindetapp/
. Um dorthin zu gelangen,public
müssen Sie zuerst eine Ebene zurücksetzen :../public/index1.html
.Hinweis:
path
ist ein integriertes Modul , dasrequire
d sein muss, damit der obige Code funktioniert:var path = require('path');
quelle
res.sendFile('../public/index.html', {root: __dirname});
funktioniert auch und es ist kürzerconsole.log(path.join(__dirname, '../public', 'index.html'));
sondernres.sendFile(path.join(__dirname, '../public', 'index.html'));
arbeite nur mitvar path = require('path');
res.sendFile('../public/index.html', {root: __dirname});
funktioniert (nicht mehr), da es 403 Forbidden zurückgibt, weil es über die Wurzel hinausgeht. Tun Sieres.sendFile('public/index.html', {root: path.dirname(__dirname)});
stattdessen.Versuchen Sie stattdessen Folgendes:
Das hat bei mir funktioniert. Der Name root: __ nimmt die Adresse an, an der sich server.js im obigen Beispiel befindet. Um dann zur Datei index1.html (in diesem Fall) zu gelangen, muss der zurückgegebene Pfad in das Verzeichnis gelangen, in dem sich der öffentliche Ordner befindet.
quelle
Hier
__dirname
wird der Name des Verzeichnisses verwaltet, in dem sich das aktuell ausgeführte Skript (server.js
) befindet.quelle
path
macht es os-unabhängig.Eine Alternative, die noch nicht aufgeführt ist und für mich funktioniert hat, besteht darin,
path.resolve
entweder separate Zeichenfolgen oder nur eine mit dem gesamten Pfad zu verwenden:Oder
(Knoten v6.10.0)
Idee von https://stackoverflow.com/a/14594282/6189078
quelle
Basierend auf den anderen Antworten ist dies ein einfaches Beispiel dafür, wie die häufigste Anforderung erfüllt werden kann:
Dies ist auch eine einfache Möglichkeit, auf jede Anfrage mit index.html zu antworten , da ich einen Stern verwende
*
, um alle Dateien abzufangen, die nicht in Ihrem statischen (öffentlichen) Verzeichnis gefunden wurden. Dies ist der häufigste Anwendungsfall für Web-Apps. Wechseln Sie zu/
, um den Index nur im Stammpfad zurückzugeben.quelle
Ich habe es versucht und es hat funktioniert.
quelle
process.cwd()
Gibt den absoluten Pfad Ihres Projekts zurück.Dann :
quelle
Eine andere Möglichkeit, dies zu tun, indem weniger Code geschrieben wird.
quelle
Sie können send anstelle von sendFile verwenden, damit Sie nicht mit Fehlern konfrontiert werden! das wird dir helfen!
um dem Browser mitzuteilen, dass Ihre Antwort ein PDF-Typ ist
Wenn Sie möchten, dass diese Datei sofort auf derselben Seite geöffnet wird, nachdem der Benutzer sie heruntergeladen hat, schreiben Sie 'inline' anstelle des Anhangs im obigen Code.
quelle
Wenn Sie dies einmal einrichten und überall verwenden möchten, konfigurieren Sie einfach Ihre eigene Middleware. Verwenden Sie beim Einrichten Ihrer App Folgendes, um eine neue Funktion für das Antwortobjekt zu definieren:
Verwenden Sie es dann wie folgt:
quelle
Ich benutze Node.Js und hatte das gleiche Problem ... Ich habe es gelöst, indem ich am Anfang jedes Skripts ein '/' hinzugefügt und auf eine statische CSS-Datei verlinkt habe.
Vor:
Nach dem:
quelle