Sebelum saya bertanya, app.router
saya pikir saya harus menjelaskan setidaknya apa yang saya pikir terjadi ketika bekerja dengan middleware. Untuk menggunakan middleware, fungsi yang digunakan adalah app.use()
. Ketika middleware dieksekusi, ia akan memanggil middleware berikutnya dengan menggunakan next()
atau membuatnya sehingga tidak ada lagi middleware yang dipanggil. Itu berarti bahwa urutan di mana saya melakukan panggilan middleware saya adalah penting, karena beberapa middleware tergantung pada middleware lain, dan beberapa middleware di bagian akhir bahkan mungkin tidak dipanggil.
Hari ini saya mengerjakan aplikasi saya dan menjalankan server saya di latar belakang. Saya ingin membuat beberapa perubahan dan menyegarkan halaman saya dan segera melihat perubahannya. Secara khusus, saya membuat perubahan pada tata letak saya. Saya tidak bisa membuatnya bekerja sehingga saya mencari Stack Overflow untuk jawabannya dan menemukan pertanyaan ini . Dikatakan untuk memastikan itu express.static()
ada di bawah require('stylus')
. Tetapi ketika saya melihat kode OP itu, saya melihat bahwa dia memiliki app.router
panggilannya di akhir panggilan middleware-nya, dan saya mencoba mencari tahu mengapa itu terjadi.
Ketika saya membuat aplikasi Express.js saya (versi 3.0.0rc4), saya menggunakan perintah express app --sessions --css stylus
dan dalam file app.js saya kode setup dengan app.router
kedua atas express.static()
dan require('stylus')
panggilan saya. Jadi sepertinya, jika sudah diatur seperti itu, maka harus tetap seperti itu.
Setelah mengatur ulang kode saya sehingga saya dapat melihat perubahan Stylus saya, tampilannya seperti ini:
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
Jadi saya memutuskan bahwa langkah pertama adalah mencari tahu mengapa penting untuk memiliki app.router
kode saya. Jadi saya berkomentar, memulai aplikasi saya dan menavigasi ke /
. Ini menampilkan halaman indeks saya dengan baik. Hmm, mungkin berhasil karena saya mengekspor rute dari file rute saya (routes.index). Jadi selanjutnya saya menavigasi ke /test
dan itu ditampilkan Uji di layar. Haha, oke, saya tidak tahu apa app.router
. Apakah itu termasuk dalam kode saya atau tidak, rute saya baik-baik saja. Jadi saya pasti kehilangan sesuatu.
Jadi Inilah Pertanyaan Saya:
Bisakah seseorang tolong jelaskan apa app.router
yang penting, pentingnya, dan di mana saya harus meletakkannya di panggilan middleware saya? Akan lebih baik jika saya mendapat penjelasan singkat tentang express.static()
. Sejauh yang saya tahu, express.static()
adalah cache informasi saya, dan jika aplikasi tidak dapat menemukan halaman yang diminta, itu akan memeriksa cache untuk melihat apakah ada.
sumber
Jawaban:
Catatan: Ini menjelaskan cara kerja Express di versi 2 dan 3. Lihat akhir posting ini untuk informasi tentang Express 4.
static
hanya melayani file ( sumber daya statis ) dari disk. Anda memberikan path (kadang-kadang disebut titik mount), dan melayani file dalam folder itu.Misalnya,
express.static('/var/www')
akan melayani file dalam folder itu. Jadi permintaan ke server Node Anda untukhttp://server/file.html
melayani/var/www/file.html
.router
adalah kode yang menjalankan rute Anda. Ketika Anda melakukannyaapp.get('/user', function(req, res) { ... });
, iturouter
yang benar-benar memanggil fungsi panggilan balik untuk memproses permintaan.Urutan yang Anda berikan untuk
app.use
menentukan urutan setiap middleware diberikan kesempatan untuk memproses permintaan. Misalnya, jika Anda memiliki file yang dipanggiltest.html
di folder statis dan rute:Yang mana yang dikirim ke klien yang meminta
http://server/test.html
? Apapun middleware yang diberikanuse
terlebih dahulu.Jika kamu melakukan ini:
Kemudian file pada disk disajikan.
Jika Anda melakukannya dengan cara lain,
Kemudian pengendali rute mendapat permintaan, dan "Halo dari pengendali rute" dikirim ke browser.
Biasanya, Anda ingin meletakkan router di atas middleware statis sehingga file yang diberi nama tidak sengaja tidak dapat menimpa salah satu rute Anda.
Perhatikan bahwa jika Anda tidak secara eksplisit
use
yangrouter
, secara implisit ditambahkan dengan Express pada titik Anda mendefinisikan sebuah rute (yang mengapa rute Anda masih bekerja meskipun Anda komentarapp.use(app.router)
).Seorang komentator telah mengemukakan poin lain tentang urutan
static
danrouter
yang belum saya bahas: dampaknya pada kinerja keseluruhan aplikasi Anda.Alasan lain di
use
router
atasstatic
adalah untuk mengoptimalkan kinerja. Jika Anda menempatkanstatic
dulu, maka Anda akan menekan hard drive pada setiap permintaan tunggal untuk melihat apakah ada file atau tidak. Dalam tes cepat , saya menemukan bahwa overhead ini berjumlah ~ 1 ms pada server yang diturunkan. (Angka itu kemungkinan besar akan lebih tinggi di bawah beban, di mana permintaan akan bersaing untuk akses disk.)Dengan yang
router
pertama, permintaan yang cocok dengan rute tidak perlu mengenai disk, menghemat milidetik berharga.Tentu saja, ada cara untuk mengurangi
static
biaya overhead.Pilihan terbaik adalah meletakkan semua sumber daya statis Anda di bawah folder tertentu. (IE
/static
) Anda kemudian dapat mestatic
- mount ke jalur itu sehingga hanya berjalan ketika jalan dimulai dengan/static
:Dalam situasi ini, Anda akan meletakkan ini di atas
router
. Ini menghindari pemrosesan middleware / router lain jika ada file, tapi jujur, saya ragu Anda akan mendapatkan sebanyak itu.Anda juga dapat menggunakan
staticCache
, yang menyimpan sumber daya statis di dalam memori sehingga Anda tidak perlu menekan disk untuk file yang biasa diminta. ( Peringatan:staticCache
tampaknya akan dihapus di masa mendatang.)Namun, saya tidak berpikir
staticCache
cache jawaban negatif (ketika file tidak ada), jadi tidak membantu jika Anda telah meletakkan distaticCache
atasrouter
tanpa memasangnya ke jalan.Seperti halnya semua pertanyaan tentang kinerja, ukur dan patok aplikasi dunia nyata Anda (sedang dimuat) untuk melihat di mana sebenarnya hambatannya.
Express 4
Express 4.0 menghapus
app.router
. Semua middleware (app.use
) dan rute (app.get
et al) sekarang diproses secara tepat sesuai urutan penambahannya.Dengan kata lain:
Baca lebih lanjut tentang perubahan dalam Express 4.
sumber
router
berjalan di satu tempat. Jika, pertama kali Anda meneleponapp.get
(post
atau orang lain), Anda belumuse
dapp.router
, Express menambahkannya untuk Anda.static
setelah iturouter
, pertanyaan tentang middleware lain menjadi tidak relevan karena harus di atas router.app.router
adalah dihapus di cabang master saat ini, yang akan mengungkapkan-4.0 . Setiap rute menjadi middleware terpisah.sumber
Dalam Versi 4 ekspres kita dapat dengan mudah menentukan rute dengan cara berikut:
server.js:
route.js:
Di
server.js
kami mengimpor objek router dariroute.js
file dan menerapkannya dengan cara berikut diserver.js
:Sekarang semua rute di
route.js
memiliki URL basis berikut:http: // localhost: 3000 / rute
Mengapa pendekatan ini:
Keuntungan utama dari mengambil pendekatan ini adalah bahwa sekarang aplikasi kita lebih modular . Semua penangan rute untuk rute tertentu sekarang dapat dimasukkan ke dalam file yang berbeda yang membuat semuanya lebih mudah dirawat dan lebih mudah ditemukan.
sumber