Misalkan Anda memiliki blok kode sederhana seperti ini:
app.get('/', function(req, res){
res.send('Hello World');
});
Fungsi ini memiliki dua parameter, req
dan res
, yang masing-masing mewakili objek permintaan dan respons.
Di sisi lain, ada fungsi lain dengan parameter ketiga yang disebut next
. Sebagai contoh, mari kita lihat kode berikut:
app.get('/users/:id?', function(req, res, next){ // Why do we need next?
var id = req.params.id;
if (id) {
// do something
} else {
next(); // What is this doing?
}
});
Saya tidak mengerti apa gunanya next()
atau mengapa ini digunakan. Dalam contoh itu, jika id tidak ada, apa yang next
sebenarnya dilakukan?
res.send
untuk menyelesaikan permintaan. Jika tidak ada, ada kemungkinan handler lain yang akan mengeluarkan kesalahan dan menyelesaikan permintaan itu.app.post('/login',function(req,res))
setelahapp.get('/users',function(req,res))
itu akan memanggil login menjadi rute berikutnya dalam file app.js dengan memanggil next ()?app.get("/users")
, maka itu akan dijalankan jika pawang di atas memanggil berikutnya.Jawaban:
Ini melewati kontrol ke rute yang cocok berikutnya . Dalam contoh yang Anda berikan, misalnya, Anda mungkin mencari pengguna di database jika
id
diberikan, dan menugaskannyareq.user
.Di bawah, Anda dapat memiliki rute seperti:
Karena / users / 123 akan cocok dengan rute dalam contoh Anda terlebih dahulu, yang pertama akan memeriksa dan menemukan pengguna
123
; maka/users
dapat melakukan sesuatu dengan hasil itu.Route middleware adalah alat yang lebih fleksibel dan kuat, menurut saya, karena itu tidak bergantung pada skema URI tertentu atau pemesanan rute. Saya akan cenderung untuk memodelkan contoh yang ditampilkan seperti ini, dengan asumsi
Users
model dengan asyncfindOne()
:Mampu mengendalikan aliran seperti ini cukup berguna. Anda mungkin ingin memiliki halaman tertentu hanya tersedia untuk pengguna dengan bendera admin:
Semoga ini memberi Anda beberapa inspirasi!
sumber
next()
lagi. Itu akan sama jika saya hanya menggunakannext(new Error(…)); return;
.next(new Error(…)); return;
. Jika kami meneruskan nilainext
, itu dianggap sebagai kesalahan secara sepihak . Saya belum melihat ke kode express terlalu banyak, tetapi gali sekitar dan Anda akan menemukan apa yang Anda butuhkan :)return next(…);
untuknext(…); return;
jadi kurang membingungkan.)Saya juga memiliki masalah dalam memahami next (), tetapi ini membantu
sumber
.get
dipanggil dan bukan yang ke-2?Sebelum memahami
next
, Anda perlu memiliki sedikit gagasan tentang siklus Request-Response dalam simpul meskipun tidak banyak detail. Itu dimulai dengan Anda membuat permintaan HTTP untuk sumber daya tertentu dan berakhir ketika Anda mengirim respons kembali ke pengguna yaitu ketika Anda menemukan sesuatu seperti res.send ('Hello World');mari kita lihat contoh yang sangat sederhana.
Di sini kita tidak perlu next (), karena resp.send akan mengakhiri siklus dan menyerahkan kontrol kembali ke rute middleware.
Sekarang mari kita lihat contoh lain.
Di sini kita memiliki 2 fungsi middleware untuk jalur yang sama. Tapi Anda akan selalu mendapat respons dari yang pertama. Karena yang dipasang pertama kali di tumpukan middleware dan kirim ulang akan mengakhiri siklus.
Tetapi bagaimana jika kita selalu tidak menginginkan "Hello World !!!!" respon balik. Untuk beberapa kondisi kita mungkin menginginkan "Hello Planet !!!!" tanggapan. Mari kita modifikasi kode di atas dan lihat apa yang terjadi.
Apa yang
next
dilakukan di sini. Dan ya, Anda mungkin memiliki gusses. Ini akan melewati fungsi middleware pertama jika kondisinya benar dan memanggil fungsi middleware berikutnya dan Anda akan mendapat"Hello Planet !!!!"
respons.Jadi, selanjutnya lewati kontrol ke fungsi selanjutnya di tumpukan middleware.
Bagaimana jika fungsi middleware pertama tidak mengirim kembali respons apa pun tetapi jalankan logika dan kemudian Anda mendapatkan respons kembali dari fungsi middleware kedua.
Sesuatu seperti di bawah ini: -
Dalam hal ini Anda membutuhkan kedua fungsi middleware untuk dipanggil. Jadi, satu-satunya cara Anda mencapai fungsi middleware kedua adalah dengan memanggil next ();
sumber
next()
berkinerja sepertigoto
dengan label terprogram? Artinya, dalam cuplikan ketiga Anda, begitu Anda meneleponnext()
,res.send("Hello World !!!!");
tidak akan pernah dieksekusi? Saya perhatikan bahwa @Ashe selalu memiliki panggilanreturn;
setelahnext
yang memiliki kode di pohon eksekusi yang sama ... Tebak saya selalu bisa hanya memeriksa ekspres, ya? /next()
panggilan dipanggil . Dalam hal ini,past the next() call
ditulis ke konsol, dan kemudian saya mendapatkanError: Can't set headers after they are sent.
kesalahan, seperti yang keduares.send
disebut, meskipun tidak berhasil. Alur kode kembali setelahnext()
panggilan, yang membuat @ Ashereturns
(atau manajemen logika lainnya) penting.next()
untuk melewati eksekusi pernyataan yang tersisa. terima kasih telah menunjukkan itu.Selanjutnya digunakan untuk meneruskan kontrol ke fungsi middleware berikutnya. Jika tidak, permintaan akan dibiarkan menggantung atau terbuka.
sumber
Memanggil fungsi ini memanggil fungsi middleware berikutnya dalam aplikasi. Fungsi () berikutnya bukan bagian dari Node.js atau Express API, tetapi argumen ketiga yang diteruskan ke fungsi middleware. Fungsi next () bisa dinamai apa saja, tetapi dengan konvensi itu selalu dinamai “next”.
sumber
Menjalankan
next
fungsi memberitahu server bahwa Anda sudah selesai dengan langkah middleware ini dan dapat menjalankan langkah selanjutnya dalam rantai.sumber