Skenario : Pertimbangkan yang berikut ini adalah bagian dari kode dari aplikasi web node.
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
Masalah : Saya sedang memeriksa yang mana yang cocok dengan hanya next()
atau return next()
. Kode contoh di atas bekerja persis sama untuk keduanya & tidak menunjukkan perbedaan dalam eksekusi.
Pertanyaan : Dapatkah seseorang menjelaskan hal ini, kapan harus digunakan next()
dan kapan harus digunakan return next()
dan beberapa perbedaan penting?
res.redirect('/')
vsreturn res.redirect('/')
dalam situasi seperti ini? Mungkin lebih baik untuk selalu menulis balasan di depan pernyataan res untuk menghindari kesalahan pengaturan header setelah dikirim?Sebagai jawaban @Laurent Perrin:
Saya memberi contoh di sini jika Anda menulis middleware seperti ini:
Anda akan mengetahui bahwa output di konsol adalah:
Artinya, ia menjalankan kode di bawah next () setelah semua fungsi middleware selesai.
Namun, jika Anda menggunakan
return next()
, itu akan segera keluar dari panggilan balik dan kodereturn next()
di bawah di panggilan balik itu tidak dapat dijangkau.sumber
express
jawaban ini membuat segalanya lebih jelas bagi saya daripada jawaban lainnya. Jempolan!res.redirect('/')
vsreturn res.redirect('/')
dalam situasi seperti ini? Mungkin lebih baik untuk selalu menulisreturn
di depanres
pernyataan untuk menghindari kesalahan mengatur tajuk setelah dikirim?next()
adalah bagian dari connect middleware . Callback untuk aliran router tidak peduli jika Anda mengembalikan sesuatu dari fungsi Anda, jadireturn next()
dannext(); return;
pada dasarnya sama.Jika Anda ingin menghentikan aliran fungsi yang dapat Anda gunakan
next(err)
seperti berikut iniCukup banyak
next()
digunakan untuk memperluas middleware permintaan Anda.sumber
next('No ID')
?next('No ID')
sebenarnya mengirim kesalahan, yang akan memutus aliran.Yang terbaik adalah tidak menggunakannya sama sekali! Saya menjelaskan, dan itulah yang saya lakukan juga menjelaskannya.
Fungsi next () yang dapat memiliki nama apa pun dan dengan konvensi telah diatur ke berikutnya. Ini secara tidak langsung terkait dengan operasi (PUT, DAPATKAN, HAPUS, ...) yang umumnya dilakukan pada sumber daya URI yang sama misalnya
/ user /: id
Sekarang jika Anda melihat app.get, app.put dan app.delete menggunakan uri yang sama (/ user /: id), satu-satunya hal yang membedakan mereka adalah implementasinya. Ketika permintaan dibuat (req) express menempatkan req terlebih dahulu di app.get, jika validasi apa pun yang Anda buat karena permintaan itu bukan untuk pengontrol itu gagal, ia meneruskan req ke app.put yang merupakan rute selanjutnya dalam file te dan sebagainya di. Seperti yang terlihat pada contoh di bawah ini.
Masalahnya terletak, bahwa pada akhirnya Anda akhirnya menyerahkan req ke semua pengendali berharap ada satu yang melakukan apa yang Anda inginkan, melalui validasi req. Pada akhirnya semua pengendali akhirnya menerima sesuatu yang bukan untuk mereka :(.
Jadi, bagaimana cara menghindari masalah next () ?
Jawabannya sangat sederhana.
1 - hanya harus ada satu uri untuk mengidentifikasi sumber daya
http: // IpServidor / colection /: resource / colection /: resource jika URI Anda lebih lama dari itu, Anda harus mempertimbangkan membuat uri baru
Contoh http: // IpServidor / pengguna / pepe / kontak / contacto1
2-Semua operasi pada sumber ini harus dilakukan dengan menghormati idempotence dari kata kerja http (get, post, put, delete, ...) sehingga panggilan ke URI benar-benar hanya memiliki satu cara panggilan
Info lebih lanjut [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources[[1]
Mari kita lihat kodenya! Implementasi konkret yang membuat kita menghindari penggunaan next ()!
Dalam file index.js
Dalam file usersRoute.js
Sekarang file usersRoute.js melakukan apa yang diharapkan dilakukan oleh file yang disebut usersRoute, yaitu mengelola rute URI / pengguna /
// file getUsersController.js
Dengan cara ini Anda menghindari penggunaan selanjutnya, Anda decouple kode, Anda mendapatkan kinerja, Anda mengembangkan SOLID, Anda membiarkan pintu terbuka untuk kemungkinan migrasi ke layanan Microsoft dan di atas semua itu, mudah dibaca oleh seorang programmer.
sumber
Lanjut() :
sumber