Ich habe diesen Code:
res.sendfile( '../../temp/index.html' )
Es wird jedoch der folgende Fehler ausgegeben:
Error: Forbidden
at SendStream.error (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:145:16)
at SendStream.pipe (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/send/lib/send.js:307:39)
at ServerResponse.res.sendfile (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:339:8)
at exports.boot (/Users/Oliver/Development/Personal/Reader/server/config/routes.js:18:9)
at callbacks (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/proto.js:199:15)
Kann mir jemand sagen, warum das so sein könnte?
res.sendfile
path.resolve
sollte tun, was Sie brauchen.Antworten:
Ich glaube, es liegt am relativen Weg; Das "../" wird als bösartig angesehen. Lösen Sie zuerst den lokalen Pfad auf und rufen Sie dann auf
res.sendfile
. Sie können den Pfad mit impath.resolve
Voraus auflösen .quelle
sendfile
als schlecht. Es sei denn, Sie geben denroot
Verzeichnisparameter an, wie hier zu sehen: github.com/visionmedia/express/issues/1465const
wird bevorzugt übervar
Diese Antwort sammelt die Informationen aus den anderen Antworten / Kommentaren.
Es hängt davon ab, ob Sie etwas relativ zum Prozessarbeitsverzeichnis (cwd) oder zum Dateiverzeichnis einfügen möchten. Beide verwenden die
path.resolve
Funktion (var path = require('path')
oben in der Datei.path.resolve('../../some/path/to/file.txt');
path.resolve(__dirname+'../../some/path/to/file.txt');
Wenn Sie den Link aus @ Joes Kommentar lesen, klingt es so, als ob relative Pfade ein Sicherheitsrisiko darstellen, wenn Sie Benutzereingaben für den Pfad akzeptieren (z. B.
sendfile('../.ssh/id_rsa')
könnte dies der erste Versuch eines Hackers sein).quelle
Die Express-Dokumentation schlägt vor, es anders zu machen, und meiner Meinung nach ist es später sinnvoller als die aktuelle Lösung.
res.sendFile('index.html', {root: './temp'});
Die Root-Option scheint
./
als Root-Verzeichnis Ihres Projekts festgelegt zu sein. Ich kann also nicht vollständig sagen, wo sich Ihre Datei in Bezug auf das Projektstammverzeichnis befindet. Wenn sich Ihr temporärer Ordner dort befindet, können Sie ihn./temp
als Stammverzeichnis für die Datei festlegen , die Sie senden.quelle
.sendfile
sondern weil sie sich vollständig auf etwas anderes stützt (Pfad). Vielen Dank für den Hinweis.