‫Instruktur: Dalam kuliah ini, mari kita terapkan cara yang
‫lebih baik untuk menangkap kesalahan di semua fungsi asinkron kita.
‫Jadi sekarang, di semua fungsi async
‫kami, kami memiliki blok try catch ini, bukan?
‫Jadi, ingat bagaimana kami menambahkan ke semua fungsi pegangan ini, coba
‫ini dan kemudian blok tangkapan ini, oke?
‫Dan semuanya memiliki ini karena
‫semuanya adalah fungsi asinkron dan
‫itulah cara kami biasanya menangkap kesalahan di
‫dalam fungsi asinkron.
‫Jadi menggunakan blok coba tangkap.
‫Nah, itu benar-benar membuat kode kita terlihat berantakan dan tidak fokus
‫sehingga tujuan dari metode createTour ini di sini, misalnya, adalah
‫menjalankan kode ini saja.
‫Kami sebenarnya tidak ingin dipusingkan
‫dengan penanganan kesalahan
‫di sini, jadi sekarang kami memiliki dua blok tambahan
‫ini, coba dan tangkap, dan dengan
‫itu muncul lekukan tambahan di sini
‫dan lagi, ini benar-benar membuat kode kami terlihat tidak bersih.
‫Ini benar-benar tidak fokus.
‫Juga, kami memiliki banyak kode duplikat di
‫sini karena di masing-masing penangan
‫ini, kami memiliki blok tangkapan yang cukup mirip.
‫Jadi dalam semua ini,
‫yang kami lakukan hanyalah mengirimkan tanggapan ini.
‫Dan tanggapan itu sebenarnya tidak akan dikirim
‫ke sini melainkan di middleware penanganan kesalahan global kami,
‫ingat, tapi itu topik lain.
‫Untuk saat ini, apa
‫yang saya coba fokuskan di sini
‫adalah bahwa blok try catch di dalam setiap fungsi async kami
‫tidak ideal dan sekarang mari kita coba untuk memperbaikinya.
‫Dan solusinya pada dasarnya adalah mengeluarkan blok try catch
‫dari sini dan meletakkannya di level yang lebih
‫tinggi di fungsi lain.
‫Jadi pada dasarnya apa yang
‫akan kita lakukan
‫adalah membuat sebuah fungsi, dan kemudian membungkus fungsi async ini ke dalam fungsi itu.
‫Baiklah?
‫Jadi izinkan saya menyebutnya catchAsync.
‫Jadi catchAsync, dan saya menyebutnya seperti ini karena
‫tujuan dari fungsi ini
‫adalah untuk menangkap kesalahan asinkron kami.
‫Sangat sederhana, bukan?
‫Jadi ke dalam fungsi
‫catchAsync ini, kita akan meneruskan sebuah fungsi, oke?
‫Dan ingat, fungsi yang akan kita lewati pada
‫dasarnya adalah yang ini.
‫Jadi sekarang kita sedang mengerjakan contoh
‫ini, fungsi yang akan kita berikan ke catchAsync adalah
‫fungsi ini karena di sinilah kita
‫ingin menangkap kesalahan asinkron.
‫Jadi mari kita lakukan itu.
‫Jadi fn, lalu bungkus seluruh fungsi itu ke sana.
‫Jadi selanjutnya, yang harus kita lakukan adalah
‫memanggil fungsi ini di sini.
‫Jadi sebut saja, dan fungsi
‫ini harus menerima permintaan, tanggapan, dan bahkan, selanjutnya.
‫Jadi yang ini di sini seharusnya juga memiliki next
‫dan semua yang
‫lain, juga, karena ingat, kita memerlukan
‫fungsi berikutnya untuk meneruskan kesalahan ke
‫dalamnya sehingga kesalahan itu kemudian
‫dapat ditangani di middleware penanganan kesalahan global.
‫Jadi semua fungsi ini akan membutuhkan
‫request, response, dan next.
‫Tapi mari kita tinggalkan itu untuk nanti.
‫Untuk saat ini, mari kita benar-benar fokus pada catchAsync kita di sini.
‫Jadi fungsi ini di sini yang kami berikan ke
‫async, yang sekarang disebut fn di
‫sini, adalah fungsi asinkron.
‫Dan ingat bahwa
‫fungsi asinkron mengembalikan janji, bukan?
‫Dan ketika ada kesalahan di dalam fungsi
‫async, itu pada dasarnya berarti bahwa janji itu ditolak.
‫Jadi di sini, di mana kita sebenarnya memanggil fungsi itu,
‫kita kemudian dapat menangkap kesalahan itu.
‫Jadi kami menangkapnya di sini,
‫alih-alih menangkapnya di blok try catch.
‫Jadi tangkap, dan kesalahan, lalu berikutnya, dan lewati kesalahan.
‫Dan kita bisa
‫menyederhanakan ini, tapi untuk sekarang mari kita hilangkan blok try
‫catch di sini, jadi fokus saja pada bagian ini.
‫Jadi hanya ini
‫yang kita inginkan dan kita tidak lagi membutuhkan blok
‫try catch, lagi, karena catch itu sekarang pada dasarnya dipindahkan ke
‫sini, ke baris ini.
‫Ini bukan lagi
‫blok tangkap, karena di sini
‫lebih mudah menggunakan janji bahwa fungsi fn kembali.
‫Jadi sekali lagi, fungsi fn ini adalah fungsi ini,
‫jadi yang kita berikan ke catchAsync,
‫dan itu akan mengembalikan janji.
‫Dan sebenarnya, saya perhatikan di sini
‫bahwa ini, tentu saja, harus disebut catchAsync, oke?
‫Dan kemudian fungsi yang
‫kami berikan ke catchAsync, yang ini tentu saja fn.
‫Baiklah?
‫Jadi argumen yang kita lewati di sana.
‫Sekarang sebenarnya ada dua masalah besar dengan
‫cara ini diterapkan sekarang dan jadi
‫cara ini, itu tidak akan berhasil sama sekali.
‫Jadi yang pertama, pemanggilan fungsi
‫ini di sini tidak memiliki cara untuk mengetahui permintaan, respons, dan selanjutnya.
‫Kami tidak meneruskannya ke catchAsync di sini,
‫jadi benar-benar tidak ada
‫cara bagi fungsi untuk mengetahui nilai parameter ini.
‫Dan kedua adalah bahwa
‫di sini kita sebenarnya memanggil fungsi async.
‫Dan untuk melihat ini sedikit lebih baik, mari
‫kita singkirkan kode ini sepenuhnya.
‫Jadi di sini kita memiliki catchAsync dan kita kemudian memanggilnya
‫menggunakan tanda kurung tentunya.
‫Dan kemudian di dalam catchAsync kami
‫juga segera memanggil fungsi fn, dan bukan
‫itu yang seharusnya berfungsi.
‫Jadi createTour di sini harus benar-benar sebuah fungsi
‫tetapi bukan hasil dari pemanggilan sebuah fungsi.
‫Tapi itulah yang terjadi sekarang.
‫Jadi sekarang catchAsync sedang
‫dipanggil, yang kemudian memanggil fungsi ini di sini, oke?
‫Dan sekali lagi, fungsi ini tidak boleh
‫dipanggil, melainkan harus duduk di sini
‫dan menunggu sampai ekspres memanggilnya.
‫Dan express tentu saja
‫akan memanggilnya segera setelah seseorang
‫mencapai rute yang membutuhkan fungsi kontrol ini.
‫Jadi solusinya adalah pada dasarnya membuat fungsi catchAsync
‫mengembalikan fungsi lain yang kemudian akan
‫ditugaskan ke createTour dan agar fungsi
‫itu nantinya
‫dapat dipanggil saat diperlukan.
‫Jadi mari kita lakukan itu di sini.
‫Jadi mari kita kembalikan fungsi anonim dan
‫ingat bahwa ini adalah fungsi yang
‫akan dipanggil oleh express.
‫Jadi di sinilah kita
‫kemudian menentukan permintaan, tanggapan, dan selanjutnya.
‫Benar-benar hilang panah di sini.
‫Dan baiklah.
‫Dan itu sebenarnya.
‫Itulah fungsi catchAsync kami.
‫Ingat saja bagaimana saya mengatakan
‫bahwa kita dapat menyederhanakannya dan itu
‫hanya karena, dalam JavaScript, kita dapat menyederhanakannya
‫seperti ini sehingga yang perlu kita sampaikan di
‫sini adalah fungsinya, dan kemudian akan dipanggil
‫secara otomatis dengan parameter yang diterima panggilan balik ini.
‫Jadi sama saja dengan menulis selanjutnya.
‫Jadi mari kita rekap di sini.
‫Jadi untuk menghilangkan blok try catch kami, kami
‫cukup membungkus fungsi asinkron kami
‫di dalam fungsi catchAsync yang baru saja kami buat.
‫Fungsi ini kemudian akan mengembalikan fungsi anonim
‫baru, yang
‫ini di sini, yang kemudian akan ditugaskan ke createTour.
‫Jadi pada dasarnya fungsi
‫inilah yang akan dipanggil segera setelah
‫tur baru dibuat menggunakan handler createTour.
‫Dan itulah mengapa ia memiliki tanda tangan yang
‫sama persis di sini sebagai fungsi asinkron ini, dengan permintaan, tanggapan, dan berikutnya.
‫Sekarang apa yang akan dilakukan fungsi ini
‫di sini adalah ia akan
‫memanggil fungsi yang kita lewati pada awalnya,
‫jadi yang ini di
‫sini, dan kemudian akan mengeksekusi semua kode yang ada di sana.
‫Sekarang karena ini adalah fungsi async
‫di sini, ia
‫akan mengembalikan janji dan oleh karena itu, jika ada
‫kesalahan dalam janji ini atau dengan kata
‫lain, jika ditolak, kita kemudian dapat menangkap
‫kesalahan yang terjadi menggunakan metode catch yaitu tersedia di semua janji.
‫Dan pada akhirnya, metode tangkap inilah yang
‫akan meneruskan kesalahan ke fungsi berikutnya yang kemudian
‫akan membuatnya sehingga kesalahan
‫kita berakhir di middleware penanganan kesalahan global kita.
‫Jadi ini di sini, baris kode
‫ini, benar-benar di mana semua keajaiban terjadi,
‫dan ini, sebenarnya, yang
‫memungkinkan kita untuk menyingkirkan blok tangkap yang kita miliki sebelumnya.
‫Dan
‫catatan: ini cukup rumit untuk membungkus kepala Anda
‫dan jika itu tidak 100% jelas,
‫jangan khawatir, itu tidak terlalu penting.
‫Ini benar-benar hanya tentang mencari tahu bagaimana
‫tepatnya kode asinkron bekerja di belakang layar dalam JavaScript.
‫Jadi ini bukan tentang express atau Node.js. js, ini
‫lebih tentang cara kerja kode asinkron.
‫Lagi pula, jika sekarang kita membuat tur
‫baru dan beberapa
‫kesalahan terjadi, misalnya, dari input yang
‫tidak valid, maka kesalahan itu tentu saja harus
‫ditangkap di sini dalam
‫fungsi tangkap ini, dan kemudian akan disebarkan ke middleware
‫penanganan kesalahan kita dan agar seseorang kemudian akan mengirim kembali
‫respons kesalahan yang diharapkan akan kami terima.
‫Jadi sekarang mari kita benar-benar mencobanya.
‫Jadi buat tur baru.
‫Di sini kita memiliki
‫tubuh, dan sekarang mari kita singkirkan salah satu bidang wajib ini.
‫Baiklah.
‫Dan itu akan memicu kesalahan, jadi mari kita lihat.
‫Dan memang, validasi tur kami gagal, yang
‫merupakan pesan kesalahan
‫yang seharusnya kami terima.
‫Sekarang di sini, Anda melihat 500 Internal Server Error ini,
‫yang hanya karena fakta bahwa
‫sekarang kesalahan yang disebarkan
‫ke middleware penanganan
‫kesalahan tidak memiliki kode status yang ditentukan
‫dan jadi ingat default kami adalah 500
‫dan itulah yang yang kemudian dikirim kembali.
‫Dan tentu saja, kita perlu
‫memperbaikinya dan kita akan melakukannya di kuliah selanjutnya dalam kursus ini.
‫Untuk saat ini, yang penting
‫di sini adalah yang pertama, fungsi catchAsync kami berfungsi
‫sebagaimana dimaksud, dan kedua, bahwa kesalahan itu benar-benar
‫disebarkan, sehingga ditangkap oleh middleware penanganan kesalahan global
‫kami yang kemudian mengirimkan respons ini kembali ke klien.
‫Sekarang mari kita lanjutkan dan ekspor fungsi
‫tangkap ini ke dalam filenya sendiri.
‫Jadi saya mengambilnya dari sini
‫dan saya akan membuat file lain saja
‫ke folder utilitas kami.
‫Jadi tangkapAsync. js.
‫Dan di sini, modul. ekspor harus hanya ini.
‫Dan itu harus bekerja dengan baik.
‫Kembali di pengontrol tur kami, kami
‫tentu saja sekarang perlu mengimpor fungsi ini.
‫Dan seperti biasa, kita perlu naik satu
‫folder dan kemudian ke folder utilitas
‫kita dan kemudian catchAsync.
‫Baiklah, dan sekarang
‫yang perlu kita lakukan adalah menyingkirkan semua
‫blok catch ini dan membungkus semua handler ke dalam catchAsync.
‫Jadi mari kita lakukan itu.
‫Pertama lakukan pembungkusnya, lalu singkirkan balok-balok ini.
‫Berikan save untuk memformat ulang, dan ini dia.
‫Dan sekarang ini hanyalah proses mengulangi
‫ini sampai semua tur, atau, maaf,
‫sampai semua penangan selesai.
‫Oke, cepat simpan.
‫Yang ini sudah selesai.
‫Selanjutnya adalah pembaruan.
‫Dan hanya satu lagi yang hilang.
‫Atau sebenarnya, itu tidak benar.
‫Di bawah sana kami memiliki lebih banyak fungsi asinkron.
‫Jadi kita akan menyingkirkan tangkapan dan percobaan di sini.
‫Dan saya yakin ini adalah yang terakhir.
‫Dan ya, memang begitu.
‫Baiklah, sekarang satu hal lain yang
‫perlu kita lakukan adalah menambahkan di samping semuanya di sini juga.
‫Tapi tentu saja, tidak dalam huruf besar.
‫Oke.
‫Dan biarkan saya memilih semuanya di sini
‫sehingga saya hanya perlu menulisnya sekali.
‫Dan itu menambahkannya ke mereka semua.
‫Dan sekarang saya kira kita sudah selesai dengan bagian ini.
‫Mari kita cepat mengujinya lagi, bukan dengan yang ini,
‫tapi dengan yang ini, tidak dengan yang
‫ini juga, jadi kita selesai.
‫Dan saya akan mencoba untuk mendapatkan
‫tur tetapi dengan ID yang tidak valid, jadi mari kita lihat apa yang terjadi di sini.
‫Dan memang, kami mendapatkan pesan kesalahan
‫kami dan lagi dengan kode status 500,
‫yang tidak benar, ingat,
‫tapi kami
‫akan mengurusnya di lain waktu.
‫Jadi sekarang, izinkan saya menunjukkan kepada Anda
‫bahwa di sinilah 500 berasal karena sekarang tidak ada kode status
‫di dalam kesalahan yang kami
‫dapatkan karena kesalahan ini, mereka
‫sebenarnya berasal dari Mongoose dan jadi kami tidak
‫memiliki cara untuk
‫menambahkan status kode untuk kesalahan ini.
‫Atau sebenarnya, tentu saja, kita bisa melakukannya, tapi
‫itu akan lebih membingungkan dan kita
‫akan menemukan cara lain nanti di
‫bagian ini.
‫Untuk saat ini, saya sangat senang dengan hasil yang kami dapatkan
‫di sini dan itu saja untuk kuliah ini.