Jeśli zrobię
res.sendfile('public/index1.html');
wtedy otrzymuję ostrzeżenie konsoli serwera
express przestarzałe
res.sendfile
: użyjres.sendFile
zamiast tego
ale działa dobrze po stronie klienta.
Ale kiedy zmienię to na
res.sendFile('public/index1.html');
Pojawia się błąd
TypeError: ścieżka musi być bezwzględna lub wskazywać root do
res.sendFile
i index1.html
nie jest renderowany.
Nie potrafię zrozumieć, jaka jest ścieżka absolutna. Mam public
katalog na tym samym poziomie co server.js
. Robię res.sendFile
z z server.js
. Oświadczyłem równieżapp.use(express.static(path.join(__dirname, 'public')));
Dodawanie struktury katalogów:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
Jaką ścieżkę bezwzględną należy określić w tym miejscu?
Używam Express 4.x.
express.static
oprogramowania pośredniego do obsługi katalogu publicznego, dlaczego musiszres.sendFile
wysyłaćpublic/index1.html
?res.sendFile
z wewnątrz,app.get('/', function(req, res){res.sendFile("...")})
aby wysłać to na żądanie.Odpowiedzi:
Oprogramowanie
express.static
pośredniczące jest niezależne od oprogramowaniares.sendFile
, więc zainicjowanie go bezwzględną ścieżką dopublic
katalogu nic nie dares.sendFile
. Musisz użyć ścieżki bezwzględnej bezpośrednio zres.sendFile
. Można to zrobić na dwa proste sposoby:res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Uwaga:
__dirname
zwraca katalog, w którym znajduje się aktualnie wykonywany skrypt. W twoim przypadku wygląda na to, że się w nimserver.js
znajdujeapp/
. Tak więc, aby dostać siępublic
, trzeba wycofać się pierwszy o jeden poziom:../public/index1.html
.Uwaga:
path
to wbudowany moduł, który musi byćrequire
d, aby powyższy kod działał:var path = require('path');
źródło
res.sendFile('../public/index.html', {root: __dirname});
też działa i jest krótszyconsole.log(path.join(__dirname, '../public', 'index.html'));
aleres.sendFile(path.join(__dirname, '../public', 'index.html'));
działa tylko zvar path = require('path');
res.sendFile('../public/index.html', {root: __dirname});
nie działa (już), ponieważ zwraca 403 Forbidden z powodu przekroczenia katalogu głównego.res.sendFile('public/index.html', {root: path.dirname(__dirname)});
Zamiast tego zrób .Zamiast tego spróbuj tego:
To zadziałało dla mnie. root: __ dirname weźmie adres, w którym znajduje się server.js w powyższym przykładzie, a następnie, aby dostać się do index1.html (w tym przypadku), zwrócona ścieżka oznacza przejście do katalogu, w którym znajduje się folder publiczny.
źródło
gdzie
__dirname
będzie zarządzać nazwą katalogu, w którym znajduje się aktualnie wykonywany skrypt (server.js
).źródło
path
czyni go niezależnym od systemu operacyjnego .Alternatywą, która nie została jeszcze wymieniona, a która działała dla mnie, jest po prostu użycie
path.resolve
oddzielnych ciągów lub tylko jednego z całą ścieżką:Lub
(Węzeł v6.10.0)
Pomysł pochodzi z https://stackoverflow.com/a/14594282/6189078
źródło
Opierając się na innych odpowiedziach, jest to prosty przykład, jak spełnić najczęstsze wymaganie:
To również podwaja się jako prosty sposób odpowiadania za pomocą index.html na każde żądanie , ponieważ używam gwiazdki
*
do wyłapywania wszystkich plików, które nie zostały znalezione w Twoim statycznym (publicznym) katalogu; co jest najczęstszym przypadkiem użycia aplikacji internetowych. Zmień na,/
aby zwrócić indeks tylko w ścieżce głównej.źródło
Spróbowałem tego i zadziałało.
źródło
process.cwd()
zwraca bezwzględną ścieżkę projektu.Następnie :
źródło
Można to zrobić w inny sposób, pisząc mniej kodu.
źródło
możesz użyć send zamiast sendFile, więc nie napotkasz błędu! to działa pomoże!
za poinformowanie przeglądarki, że Twoja odpowiedź to typ PDF
jeśli chcesz, aby ten plik otwierał się natychmiast na tej samej stronie po pobraniu go przez użytkownika. napisz „inline” zamiast załącznika w powyższym kodzie.
źródło
Jeśli chcesz to skonfigurować raz i używać go wszędzie, po prostu skonfiguruj własne oprogramowanie pośrednie. Podczas konfigurowania aplikacji użyj następujących elementów, aby zdefiniować nową funkcję w obiekcie odpowiedzi:
Następnie użyj go w następujący sposób:
źródło
Używam Node.Js i miałem ten sam problem ... Rozwiązałem po prostu dodanie „/” na początku każdego skryptu i łącze do statycznego pliku css.
Przed:
Po:
źródło