Mam ten kod:
res.sendfile( '../../temp/index.html' )
Jednak wyrzuca ten błąd:
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)
Czy ktoś może mi powiedzieć, dlaczego tak się dzieje?
res.sendfile
path.resolve
powinien zrobić to, czego potrzebujesz.Odpowiedzi:
Uważam, że dzieje się tak z powodu względnej ścieżki; „../” jest uważany za złośliwy. Najpierw ustal ścieżkę lokalną, a następnie zadzwoń
res.sendfile
. Możesz wcześniej rozwiązać ścieżkępath.resolve
.źródło
sendfile
za złe. Chyba że określiszroot
parametr katalogu, jak widać tutaj: github.com/visionmedia/express/issues/1465const
jest preferowana nadvar
Ta odpowiedź zbiera informacje z innych odpowiedzi / komentarzy.
Zależy to od tego, czy chcesz dołączyć coś odnoszącego się do katalogu roboczego procesu (cwd), czy katalogu plików. Oba używają
path.resolve
funkcji (umieśćvar path = require('path')
na początku pliku.path.resolve('../../some/path/to/file.txt');
path.resolve(__dirname+'../../some/path/to/file.txt');
Czytając link z komentarza @ Joe, wydaje się, że ścieżki względne stanowią zagrożenie bezpieczeństwa, jeśli akceptujesz dane wejściowe użytkownika dla ścieżki (np.
sendfile('../.ssh/id_rsa')
Może to być pierwsza próba hakera).źródło
Dokumentacja Express sugeruje zrobienie tego w inny sposób i moim zdaniem ma to większy sens później niż obecne rozwiązanie.
res.sendFile('index.html', {root: './temp'});
Wydaje się, że opcja root jest ustawiona
./
jako katalog główny twojego projektu. Dlatego nie mogę w pełni określić, gdzie znajduje się plik w stosunku do katalogu głównego projektu, ale jeśli znajduje się tam folder tymczasowy, możesz ustawić./temp
jako katalog główny wysyłanego pliku.źródło
.sendfile
ale dlatego, że polega na czymś zupełnie innym (ścieżce). Dziękuję za zwrócenie uwagi.