Nie znam funkcji do zrobienia tego, czy ktoś o niej wie?
203
Ten przykład był dla mnie bardzo pomocny:
https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js
Więc to właściwie ta część:
// "app.router" positions our routes
// above the middleware defined below,
// this means that Express will attempt
// to match & call routes _before_ continuing
// on, at which point we assume it's a 404 because
// no route has handled the request.
app.use(app.router);
// Since this is the last non-error-handling
// middleware use()d, we assume 404, as nothing else
// responded.
// $ curl http://localhost:3000/notfound
// $ curl http://localhost:3000/notfound -H "Accept: application/json"
// $ curl http://localhost:3000/notfound -H "Accept: text/plain"
app.use(function(req, res, next){
res.status(404);
// respond with html page
if (req.accepts('html')) {
res.render('404', { url: req.url });
return;
}
// respond with json
if (req.accepts('json')) {
res.send({ error: 'Not found' });
return;
}
// default to plain-text. send()
res.type('txt').send('Not found');
});
app.router
jest teraz przestarzałe. Zobacz github.com/strongloop/express/wiki/…res.json
zamiastres.send()
. Zachowują się tak samo w twoim kodzie, ale użycieres.json
spowoduje magię w automatycznej konwersji obiektów na ciągi, w których.send()
nie będzie. Lepiej dmuchać na zimne. expressjs.com/api.html#res.jsonMyślę, że powinieneś najpierw zdefiniować wszystkie swoje trasy i dodać ostatnią trasę
Przykładowa aplikacja, która działa:
app.js:
źródło
app.get('/public/*', function(req, res){ res.sendfile(__dirname + '/public/' + req.url); })
możesz użyć tej trasy do wysyłania plików statycznych. działa dobrze z powyższą trasą „*”.app.use(express.static(__dirname + '/public'));
nie działa dla mnie przewodowo.app.use(express.static(...))
przyszłyapp.use(app.router)
. Po ich zmianie wszystko wyszło dobrze.Możesz umieścić oprogramowanie pośrednie na ostatniej pozycji, która zgłasza
NotFound
błąd,a nawet renderuje stronę 404 bezpośrednio:
źródło
use()
TWOJEJapp.router
po raz ostatni. (jak w moim przypadku)GET
). SpróbujPOST
użyć losowego adresu URL inną metodą; zwróci wartość domyślnąCannot POST...
. Osoba atakująca wiedziałaby wtedy, że korzystasz z Express.JS.res.render('404')
Powyższe odpowiedzi są dobre, ale w połowie z nich nie otrzymasz 404, ponieważ kod statusu HTTP powrócił, a w drugiej połowie nie będziesz mieć możliwości renderowania niestandardowego szablonu. Najlepszym sposobem na utworzenie niestandardowej strony błędu (404) w Expressjs jest
Umieść ten kod na końcu wszystkich mapowań adresów URL.
źródło
W ostatniej linii app.js po prostu wstaw tę funkcję. Spowoduje to zastąpienie domyślnej strony błędu „nie znaleziono strony”:
Zastąpi wszystkie żądania, które nie mają prawidłowego modułu obsługi i wyświetli własną stronę błędów.
źródło
Odpowiedź na twoje pytanie brzmi:
A tam jest wielki artykuł o tym, dlaczego jest to najlepszy sposób tutaj .
źródło
send
iend
?send
express-error-handler umożliwia określenie własnych błędów, szablonów, stron statycznych lub programów obsługi błędów. Wykonuje także inne przydatne czynności związane z obsługą błędów, które każda aplikacja powinna wdrożyć, takie jak ochrona przed atakami DOS z błędem 4xx i płynne zamykanie w przypadku nieodwracalnych błędów. Oto jak robisz to, o co prosisz:
Lub dla niestandardowego modułu obsługi:
Lub dla niestandardowego widoku:
źródło
W niektórych przypadkach strona 404 nie może zostać zapisana jako ostatnia trasa, szczególnie jeśli masz asynchroniczną funkcję routingu, która sprowadza trasę / późno na imprezę. W takich przypadkach można zastosować poniższy wzór.
źródło
https://github.com/robrighter/node-boilerplate/blob/master/templates/app/server.js
To właśnie robi płyta węzłowa.
źródło
źródło
Najprostszym sposobem na to jest złapanie wszystkich na stronę błędu
Następnie
Teraz możesz przechowywać wszystkie strony „html” (w tym stronę błędu „html”) w zmiennej
Teraz po prostu wywołujesz strony za pomocą metody Get i łapiesz wszystkie dla wszystkich niedostępnych tras, aby przekierować na stronę błędu za pomocą app.get („*”)
Nie zapomnij skonfigurować portu i nasłuchuj na serwerze:
Powinno to teraz wyświetlać stronę błędów dla wszystkich nierozpoznanych punktów końcowych!
źródło
Chociaż powyższe odpowiedzi są poprawne, dla tych, którzy chcą, aby to działało w IISNODE, musisz również określić
w pliku web.config (w przeciwnym razie IIS zje dane wyjściowe).
źródło
możesz obsługiwać błędy w zależności od typu zawartości
Dodatkowo obsługa zgodnie z kodem statusu.
app.js
404.jade
Jeśli możesz użyć res.format, możesz napisać prosty kod obsługi błędów.
Zalecenie
res.format()
zamiastres.accepts()
.Jeśli błąd 500 występuje w poprzednim kodzie,
if(500 == err.status){. . . }
wywoływany jestźródło
Cześć, proszę znaleźć odpowiedź
źródło
Jeśli używasz pakietu ekspresowego:
next (err);
Ten kod przesyła cię do oprogramowania pośredniego 404.
źródło
Aby wysłać na niestandardową stronę:
źródło
Użyłem poniższego programu obsługi do obsługi błędu 404 za pomocą
.ejs
pliku statycznego .Umieść ten kod w skrypcie trasy i następnie wymagają
file.js
pośrednictwemapp.use()
w twoimapp.js
/server.js
/www.js
(w przypadku korzystania IntelliJ dla NodeJS)Możesz także użyć
.html
pliku statycznego .W ten sposób działający serwer ekspresowy zareaguje poprawnie,
404 error
a twoja strona internetowa może również zawierać stronę, która poprawnie wyświetla odpowiedź 404 serwera poprawnie. Można również zawieraćnavbar
w to404 error template
, że linki do innych ważnych treści witryny.źródło
Jeśli chcesz przekierowywać na strony błędów ze swoich funkcji (tras), wykonaj następujące czynności -
Dodaj kod ogólnych komunikatów o błędach w pliku app.js -
W swojej funkcji zamiast przekierowania na stronę błędów możesz najpierw ustawić status błędu, a następnie użyć next (), aby przepływ kodu przebiegał powyżej kodu -
źródło
Strona 404 powinna zostać skonfigurowana tuż przed wywołaniem app.listen.Express obsługuje * w ścieżkach tras. To specjalna postać, która pasuje do wszystkiego. Można tego użyć do utworzenia procedury obsługi trasy, która pasuje do wszystkich żądań.
źródło
Obejmujące wszystkie czasowniki HTTP w
express
Aby objąć wszystkie czasowniki HTTP i wszystkie pozostałe ścieżki, których możesz użyć:
Ostateczne rozwiązanie wyglądałoby tak:
Nie należy zapominać o umieszczeniu routera na końcu. Ponieważ kolejność routerów ma znaczenie.
źródło
Powyższy kod nie działał dla mnie.
Więc znalazłem nowe rozwiązanie, które faktycznie działa!
Lub możesz nawet wyrenderować go na stronie 404.
Mam nadzieję, że to ci pomogło!
źródło
źródło