‫Guru: Dalam video ini, mari
‫kita membuat kelas kesalahan yang lebih baik dan lebih
‫berguna, dan juga melakukan beberapa refactoring.
‫Dan mulai dengan kelas kesalahan itu,
‫mari buat file baru di folder Utilitas kita.
‫Jadi, file baru, dan saya
‫akan menyebutnya AppError karena itu akan menjadi nama kelasnya, oke?
‫Jadi, kelas AppError, dan kita sebenarnya ingin semua objek
‫AppError kita mewarisi dari kesalahan bawaan,
‫jadi mari kita perluas kelas kesalahan bawaan.
‫Jadi, kami menggunakan Extends Error, oke?
‫Jadi, kita pernah melakukannya di suatu tempat
‫di kursus ini, dan sekali lagi ini hanya kelas ES6, oke?
‫Dalam hal ini, pewarisan
‫kelas, di mana satu kelas mewarisi dari yang lain, oke?
‫Kemudian, seperti biasa, konstruktor kita, dan
‫apa yang akan kita berikan
‫ke objek baru yang dibuat dari
‫kelas AppError akan menjadi pesan dan kode status, jadi hanya
‫dua ini.
‫Oke, jadi, ingat metode konstruktor dipanggil setiap
‫kali kita membuat objek baru dari kelas ini.
‫Sekarang, seperti biasa, ketika kami memperluas
‫kelas induk, kami memanggil super untuk memanggil konstruktor
‫induk, baiklah, dan kami
‫melakukannya dengan pesan karena pesan sebenarnya adalah
‫satu-satunya parameter yang diterima oleh kesalahan bawaan.
‫Oke, jadi ini pada dasarnya Anda, seperti, kesalahan
‫panggilan, baiklah, dan kemudian ini adalah
‫hal-hal yang biasa,
‫kami mengatur statusCode ke statusCode, baiklah, dan sekarang kami
‫juga ingin mengatur status itu sendiri.
‫Jadi, ingat statusnya bisa gagal atau error, dan kita
‫bisa meneruskannya ke objek, tapi
‫itu juga tidak
‫terlalu diperlukan, karena statusnya tergantung pada statusCode.
‫Jadi, ketika statusCode adalah 400, maka
‫statusnya akan gagal,
‫dan jika 500, maka itu akan menjadi kesalahan, kan,
‫dan itu hanya menguji apakah
‫statusCode dimulai dengan empat.
‫Jadi, dalam JavaScript, ada metode startWith yang dapat kita
‫panggil pada string, jadi
‫saya pikir itu cara termudah untuk melakukan
‫tes ini, dan pada dasarnya mengubah statusCode menjadi string,
‫dan untuk itu saya hanya menggunakan template string
‫dengan kode di sana, jadi ini,
‫atau sebenarnya kita bisa menggunakan statusCode.
‫Jadi,
‫statusCode, dan kemudian startWith, maka
‫di sini kita juga membutuhkan string, dan
‫jika statusCode sebagai string dimulai dengan empat, maka kita gagal.
‫Jadi di sini, mari kita gunakan ternary,
‫oke, jadi itu gagal ketika dimulai
‫dengan empat, dan jika tidak, itu adalah kesalahan, oke?
‫Jadi, sangat sederhana, dan ini sudah menyelamatkan
‫kita dari harus lulus secara manual baik gagal atau kesalahan.
‫Baiklah, sekarang selanjutnya, semua kesalahan
‫yang akan kita
‫buat menggunakan kelas ini semuanya adalah kesalahan operasional.
‫Jadi, kesalahan yang
‫bisa kita prediksi akan terjadi di
‫beberapa titik di masa depan,
‫seperti misalnya pengguna membuat tur tanpa bidang yang diperlukan, bukan?
‫Jadi itu adalah kesalahan operasional, oke, dan
‫sekali lagi, mulai sekarang, kami akan
‫selalu menggunakan kelas AppError ini di
‫sini yang kami buat
‫sekarang untuk membuat semua kesalahan dalam aplikasi kami.
‫Jadi kesalahan ini akan menjadi kesalahan operasional, jadi
‫yang akan saya lakukan
‫sekarang adalah membuat file . adalah properti operasional di sini.
‫Jadi ini. beroperasi, dan
‫setel ke true.
‫Jadi semua kesalahan kami akan
‫membuat properti ini disetel ke true,
‫dan saya melakukannya
‫agar nanti kami dapat menguji properti ini
‫dan hanya mengirim pesan kesalahan
‫kembali ke klien untuk kesalahan operasional
‫yang kami buat menggunakan kelas ini.
‫Dan ini berguna karena beberapa
‫kesalahan tak terduga gila lainnya yang mungkin
‫terjadi di aplikasi kita, misalnya kesalahan pemrograman, atau
‫beberapa bug di salah satu paket yang
‫kita perlukan ke dalam aplikasi kita,
‫dan kesalahan ini
‫tentu saja tidak akan terjadi. adalah properti operasional
‫pada mereka, baiklah, dan mungkin terdengar
‫agak membingungkan pada saat ini,
‫tapi jangan khawatir, itu akan
‫sangat masuk akal ketika kita
‫kemudian mengimplementasikan bagian yang baru saja saya sebutkan.
‫Jadi, pengujian untuk ini. adalah properti operasional di sini.
‫Baiklah, dan sekarang hanya satu langkah
‫terakhir adalah bahwa kita sebenarnya juga perlu menangkap jejak tumpukan.
‫Sekarang, apa yang saya maksud dengan stack trace?
‫Jadi, izinkan saya menunjukkannya kepada
‫Anda, jadi, tunjukkan apa itu stack trace, jadi
‫saya akan mencatatnya di sini ke konsol.
‫Menghibur. log dan kesalahan. stackTrace,
‫jadi setiap kesalahan mendapatkan jejak tumpukan ini,
‫dan sebenarnya itu hanya tumpukan, oke.
‫Jadi salah. stack pada dasarnya akan
‫menunjukkan kepada kita di mana kesalahan terjadi.
‫Jadi biarkan saya menjalankan
‫ini di sini sekarang, jadi mari kita
‫lihat ini, dan itu memberi
‫kita kesalahan di sini dan juga di mana itu terjadi, oke?
‫Jadi, dalam hal ini di sini,
‫tentu saja, tambahkan app. js pada baris 32.
‫Jadi, di sini.
‫Jadi, di situlah kami
‫membuat kesalahan ini, dan sekarang
‫ada dalam jejak tumpukan kami, dan itu juga menunjukkan
‫kepada kami seluruh tumpukan panggilan di sini, yang pada akhirnya berasal dari kesalahan ini, oke?
‫Jadi kami ingin mempertahankannya
‫dan juga pada saat yang sama tidak menambahkan metode ini
‫di sini, atau kelas ini, ke trek tumpukan itu, oke?
‫Dan lagi, kedengarannya agak membingungkan,
‫saya tahu, tapi dalam
‫hal ini tidak terlalu penting, yang
‫penting kita hanya menambahkan baris kode ini di
‫sini, yaitu Error. capturestackTrace, jadi persis apa
‫yang Anda dapatkan di sini, dan
‫pada awalnya kita perlu menentukan objek saat ini,
‫yaitu ini, dan kemudian kelas AppError itu sendiri, yang akan
‫menjadi ini. konstruktor.
‫Oke, jadi begini ketika objek baru dibuat,
‫dan fungsi konstruktor dipanggil, maka pemanggilan fungsi itu
‫tidak akan muncul di
‫jejak tumpukan, dan tidak akan mencemarinya.
‫Baiklah,
‫jadi mari kita taruh di
‫sini, dan ya, jadi itu kelas AppError kita,
‫jadi sekarang kita benar-benar mengekspornya dari sini.
‫Jadi, modul. ekspor tentu saja AppError.
‫Bagus, hanya satu pertanyaan yang mungkin Anda miliki adalah 'Mengapa
‫saya tidak mengatur ini. pesan sama dengan pesan? ' Yah,
‫itu hanya karena di sini saya memanggil
‫kelas induknya, benar, dan kelas induknya adalah
‫kesalahan, dan apa pun yang kita masukkan ke
‫dalamnya akan menjadi properti pesan.
‫Jadi seperti yang saya katakan sebelumnya.
‫Jadi, pada dasarnya, di sini dengan melakukan panggilan induk ini, kita
‫telah menyetel properti pesan ke
‫pesan masuk kita.
‫Baiklah, simpan, dan sekarang kita bisa menutupnya, kita tidak
‫membutuhkannya lagi, dan
‫di sini kita hanya akan mengimpornya di sini.
‫Const AppError,
‫require,
‫dan kemudian di
‫utils, jadi Utilities, dan appError, oke, dan sekarang
‫mari kita lanjutkan dan menggunakannya.
‫Komentari bagian kode ini, dan
‫hapus salah satu yang kita miliki sebelumnya,
‫dan itu sekarang
‫akan membuat kesalahan di sini di dalam berikutnya.
‫Jadi, AppError baru, lalu
‫pesannya, yang
‫ini, dan kode
‫statusnya.
‫Benar, dan yang gagal, ingat, akan
‫secara otomatis diketahui, jadi mari kita hapus semua ini,
‫simpan di
‫sini, dan sekali lagi, uji rute yang salah ini, dan
‫memang kita masih mendapatkan kesalahan yang sama,
‫dan kami juga masih mendapatkan jejak tumpukan yang sama persis.
‫Oke, dan akhirnya saya sebenarnya
‫juga ingin mengekspor middleware ini ke sini, oke?
‫Jadi pada dasarnya, handler ini
‫karena di seluruh bagian lainnya, kita
‫akan membangun beberapa fungsi
‫berbeda untuk penanganan dengan jenis kesalahan yang berbeda, jadi
‫saya ingin semua
‫fungsi ini ada di file yang sama, oke?
‫Dan kita dapat mengatakan bahwa semua
‫fungsi yang baru saja saya sebutkan adalah penangan,
‫oke, dan penangan, kami juga menyebutnya pengontrol
‫dalam konteks arsitektur MVC, dan sekarang
‫mari kita membuat
‫file pengontrol kesalahan di folder pengontrol kita.
‫Oke, dan ini mungkin terdengar atau terlihat agak aneh karena kita sebenarnya
‫tidak memiliki sumber kesalahan, jadi mungkin beberapa orang akan
‫tidak setuju dengan saya bahwa ini adalah tempat
‫yang benar, tetapi saya pribadi
‫suka melakukannya seperti ini karena di pada
‫akhirnya, fungsi-fungsi
‫ini, mereka seperti benar-benar untuk mengendalikan
‫kesalahan kita, baiklah, dan bagi saya setidaknya
‫masuk akal untuk memanggil fungsi ini
‫di sini pengontrol kesalahan, dan di sini saya ingin menempelkan
‫fungsi middleware itu , tapi saya rasa saya tidak
‫menyalinnya, jadi mari kita lakukan itu lagi.
‫Baiklah, dan sebenarnya saya akan mengekspor yang ini
‫ke sini sebagai modul. ekspor karena
‫fungsi pegangan lain
‫yang akan kita buat
‫nanti, saya tidak akan mengekspornya dari sini.
‫Jadi mereka hanya akan menjadi pembantu.
‫Jadi, modul. ekspor sama dengan fungsi ini, oke?
‫Mari kita benar-benar menyingkirkan konsol ini. login di sini,
‫simpan, dan sekarang kembali ke aplikasi kita,
‫tentu saja kita sekarang perlu mencolokkan
‫fungsi middleware di sini.
‫Jadi, mari kita lanjutkan dan mengimpornya
‫dan saya dapat menyebutnya apa
‫pun
‫yang saya inginkan, jadi
‫izinkan saya menyebutnya globalErrorHandler dengan
‫huruf kapital H,
‫dan saya akan memerlukan pengontrol dan errorController.
‫Letakkan kembali di sini, dan sekarang untuk tes
‫terakhir setelah refactoring ini.
‫Mari kita lihat, dan memang
‫sekali lagi, semuanya bekerja dengan baik, oke?
‫Jadi, sempurna, itulah tujuan dari video ini, sampai jumpa
‫di video berikutnya.