Saya tidak tahu fungsi untuk melakukan ini, apakah ada yang tahu tentang fungsi ini?
203
Saya menemukan contoh ini cukup membantu:
https://github.com/visionmedia/express/blob/master/examples/error-pages/index.js
Jadi sebenarnya bagian ini:
// "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
sekarang sudah tidak digunakan lagi. Lihat github.com/strongloop/express/wiki/…res.json
daripadares.send()
. Mereka akan berperilaku sama dalam kode Anda tetapi menggunakanres.json
akan melakukan beberapa keajaiban dalam objek konversi otomatis ke string di mana.send()
tidak. Lebih baik aman daripada menyesal. expressjs.com/api.html#res.jsonSaya pikir Anda harus terlebih dahulu menentukan semua rute Anda dan sebagai tambahan rute terakhir
Contoh aplikasi yang berfungsi:
app.js:
sumber
app.get('/public/*', function(req, res){ res.sendfile(__dirname + '/public/' + req.url); })
Anda dapat menggunakan rute ini untuk mengirim file statis. berfungsi dengan baik dengan rute "*" di atas.app.use(express.static(__dirname + '/public'));
tidak bekerja untuk saya, kabel.app.use(express.static(...))
datang setelahapp.use(app.router)
. Setelah saya beralih mereka semua baik-baik saja.Anda bisa meletakkan middleware di posisi terakhir yang menimbulkan
NotFound
kesalahan,atau bahkan merender halaman 404 secara langsung:
sumber
use()
Andaapp.router
pada saat terakhir. (seperti dalam kasus saya)GET
s). Coba kePOST
URL acak dengan metode lain; itu akan mengembalikan defaultCannot POST...
. Penyerang kemudian akan tahu Anda menggunakan Express.JS.res.render('404')
Jawaban di atas bagus, tetapi di setengahnya Anda tidak akan mendapatkan 404 karena kode status HTTP Anda dikembalikan dan di setengah lainnya, Anda tidak akan dapat membuat templat render kustom. Cara terbaik untuk memiliki halaman kesalahan khusus (404) di Expressjs adalah
Tempatkan kode ini di akhir semua pemetaan URL Anda.
sumber
Pada baris terakhir app.js, cukup masukkan fungsi ini. Ini akan menggantikan halaman kesalahan tidak ditemukan halaman default:
Itu akan mengesampingkan semua permintaan yang tidak memiliki penangan yang valid dan membuat halaman kesalahan Anda sendiri.
sumber
Jawaban atas pertanyaan Anda adalah:
Dan ada artikel bagus tentang mengapa ini adalah cara terbaik di sini .
sumber
send
danend
?send
express-error-handler memungkinkan Anda menentukan template khusus, halaman statis, atau penangan kesalahan untuk kesalahan Anda. Ia juga melakukan hal-hal penanganan kesalahan bermanfaat lainnya yang harus diterapkan oleh setiap aplikasi, seperti melindungi dari serangan DOS kesalahan 4xx, dan shutdown yang anggun pada kesalahan yang tidak dapat dipulihkan. Inilah cara Anda melakukan apa yang Anda minta:
Atau untuk penangan khusus:
Atau untuk tampilan khusus:
sumber
Ada beberapa kasus di mana halaman 404 tidak dapat ditulis untuk dieksekusi sebagai rute terakhir, terutama jika Anda memiliki fungsi routing yang tidak sinkron yang membawa / rute terlambat ke pesta. Pola di bawah ini mungkin diadopsi dalam kasus-kasus itu.
sumber
https://github.com/robrighter/node-boilerplate/blob/master/templates/app/server.js
Inilah yang dilakukan simpul-boilerplate.
sumber
sumber
Cara termudah untuk melakukannya adalah dengan menangkap semua untuk Halaman Kesalahan
Kemudian
Sekarang Anda dapat menyimpan semua halaman "html" Anda (termasuk halaman "html" kesalahan) dalam sebuah variabel
Sekarang Anda cukup memanggil halaman menggunakan Metode Get dan dapatkan semua untuk setiap rute yang tidak tersedia untuk mengarahkan ke halaman kesalahan Anda menggunakan app.get ("*")
Jangan lupa untuk mengatur Port dan Dengarkan server:
Ini sekarang akan menampilkan halaman kesalahan Anda untuk semua titik akhir yang tidak dikenal!
sumber
Meskipun jawaban di atas benar, bagi mereka yang ingin ini berfungsi di IISNODE Anda juga perlu menentukan
di web.config Anda (jika tidak, IIS akan memakan output Anda).
sumber
Anda dapat menangani kesalahan sesuai dengan tipe konten
Selain itu, penanganan sesuai dengan kode status.
app.js
404.jade
Jika Anda dapat menggunakan res.format, Anda dapat menulis kode penanganan kesalahan sederhana.
Rekomendasi
res.format()
bukanres.accepts()
.Jika kesalahan 500 terjadi pada kode sebelumnya,
if(500 == err.status){. . . }
dipanggilsumber
Hai tolong temukan jawabannya
sumber
Jika Anda menggunakan paket generator ekspres:
selanjutnya (err);
Kode ini mengirim Anda ke middleware 404.
sumber
Untuk mengirim ke halaman khusus:
sumber
Saya menggunakan pengendali di bawah ini untuk menangani kesalahan 404 dengan
.ejs
file statis .Menempatkan kode ini dalam naskah rute dan kemudian mengharuskan
file.js
melaluiapp.use()
di Andaapp.js
/server.js
/www.js
(jika menggunakan IntelliJ untuk NodeJS)Anda juga dapat menggunakan
.html
file statis .Dengan cara ini, server ekspres yang berjalan akan merespons dengan benar
404 error
dan situs web Anda juga dapat menyertakan halaman yang menampilkan respons 404 server dengan benar. Anda juga bisa memasukkannavbar
dalam404 error template
yang link ke konten penting lain dari situs Anda.sumber
Jika Anda ingin mengarahkan ulang ke halaman kesalahan dari fungsi Anda (rute) maka lakukan hal-hal berikut -
Tambahkan kode pesan kesalahan umum di app.js Anda -
Dalam fungsi Anda, alih-alih menggunakan redirect halaman kesalahan, Anda dapat menggunakan mengatur status kesalahan terlebih dahulu dan kemudian menggunakan next () agar aliran kode melewati kode di atas -
sumber
Halaman 404 harus disiapkan tepat sebelum panggilan ke app.listen.Express memiliki dukungan untuk * di jalur rute. Ini adalah karakter khusus yang cocok dengan apa pun. Ini dapat digunakan untuk membuat pengendali rute yang cocok dengan semua permintaan.
sumber
Mencakup semua kata kerja HTTP dalam
express
Untuk mencakup semua kata kerja HTTP dan semua jalur yang tersisa, Anda dapat menggunakan:
Solusi akhir akan terlihat seperti ini:
Anda tidak boleh lupa untuk menempatkan router pada akhirnya. Karena urutan router penting.
sumber
Kode di atas tidak berfungsi untuk saya.
Jadi saya menemukan solusi baru yang benar-benar berfungsi!
Atau Anda bahkan dapat merendernya menjadi halaman 404.
Semoga ini bisa membantu Anda!
sumber
sumber