‫-: Dalam kuliah ini, kami akan mengizinkan
‫pengguna yang saat ini masuk untuk memanipulasi data penggunanya.
‫Jadi sekarang, dengan menerapkan pembaruan
‫pengguna, kami benar-benar meninggalkan domain otentikasi
‫dan beralih lebih ke hal-hal terkait pengguna nyata, oke?
‫Jadi daripada menggunakan pengontrol autentikasi sekarang, mari
‫terapkan fungsionalitas pembaruan ini langsung
‫di userController mereka.
‫Oke, jadi
‫kita punya banyak handler, jadi
‫rute, yang tidak benar-benar diimplementasikan di sini, oke?
‫Tapi mari kita kesampingkan untuk saat
‫ini dan buat fungsi handler baru kita di sini.
‫Dan yang ini akan disebut updateMe.
‫Dan sekali lagi, ini updateMe karena untuk memperbarui
‫pengguna yang saat ini diautentikasi.
‫Nanti kita juga akan mengimplementasikan
‫fungsi updateUser ini disini, tapi itu nanti seperti
‫administrator untuk mengupdate semua data user, sedangkan user
‫sendiri hanya bisa update, setidaknya untuk saat ini, nama
‫dan alamat email.
‫Jadi, permintaan, tanggapan, dan selanjutnya.
‫(keyboard clacking) Dan kami benar-benar melakukan
‫ini, jadi memperbarui data pengguna, dalam rute
‫yang berbeda dari memperbarui kata sandi pengguna,
‫karena biasanya dalam aplikasi web biasa
‫itu selalu dilakukan.
‫Jadi Anda biasanya memiliki satu
‫tempat di mana Anda dapat memperbarui
‫kata sandi Anda dan kemudian tempat lain di
‫mana Anda dapat memperbarui data tentang pengguna atau akun itu sendiri.
‫Jadi di sini, pada dasarnya kita mengikuti pola itu.
‫Jadi sekali lagi, mari kita mulai dengan menyusun langkah-langkah kita.
‫Dan hal pertama yang ingin
‫kami lakukan di sini pada dasarnya
‫membuat kesalahan jika pengguna mencoba memperbarui kata sandi.
‫Jadi buat kesalahan jika pengguna memposting pada
‫dasarnya data kata sandi.
‫Tetapi jika tidak, kita hanya perlu memperbarui dokumen pengguna.
‫Cukup sederhana, dan mari kita mulai dengan
‫yang pertama.
‫Tentu saja akan ada
‫badan di mana kita akan meneruskan
‫data, jadi jika di badan itu ada data tentang kata
‫sandi, atau konfirmasi kata sandi...
‫(tombol berbunyi) Konfirmasi.
‫Nah dalam hal ini, kami ingin segera kembali
‫dan membuat Apperror baru.
‫Oh dan saya kira kita belum menerapkannya di sini,
‫atau benar-benar membutuhkan, jadi
‫mari kita ambil dari sini.
‫Jadi AppError...
‫Itu tidak
‫ada di sini, jadi userController...
‫Jadi AppError, ini dia.
‫Jadi 'Rute ini bukan untuk pembaruan kata sandi.
‫'Silakan gunakan /updateMYPassword. ' Jadi pada
‫dasarnya rute yang kami tentukan sebelumnya.
‫Jadi perbaruiMYPassword.
‫Dan juga, kode 400 untuk permintaan yang buruk.
‫Dan mari kita coba yang ini segera.
‫Dan untuk itu hanya
‫dua hal, pertama kita perlu mengirim
‫kembali tanggapan, jadi katakanlah res. status(200) untuk oke, lalu
‫json, tambahkan
‫status sebagai sukses.
‫Dan nanti kami juga akan mengirim pengguna yang diperbarui,
‫tetapi biarkan saja nanti.
‫Jadi begitulah jawabannya, dan sekarang tentunya
‫kita juga perlu menambahkan route ini ke Router pengguna kita.
‫Jadi itu tentu saja mirip dengan memperbarui kata
‫sandi saya, jadi router, dan tentu saja tambalan, /updateMe,
‫sekali
‫lagi, itu adalah rute yang dilindungi
‫sehingga hanya pengguna yang saat ini diautentikasi yang dapat memperbarui
‫data pengguna saat ini.
‫Dan semua ini tentunya sangat aman,
‫lagi-lagi karena ID user yang akan diupdate berasal
‫dari request. pengguna, yang
‫ditetapkan oleh middleware pelindung ini di sini, yang pada gilirannya
‫mendapat ide dari token web json, dan karena tidak
‫ada yang dapat mengubah ID di token web
‫json itu tanpa mengetahui rahasianya, kami
‫tahu bahwa ID tersebut kemudian aman karena itu.
‫Dan karena ini, semuanya di sini aman.
‫Jadi, userController. perbaruiME.
‫Sekarang oke...
‫Jadi mari kita uji ini sekarang.
‫Silakan dan salin ini lagi.
‫Dan pertama-tama, mari kita atur otorisasi.
‫Sekali lagi dari Token Pembawa dan tentu saja
‫dengan variabel lingkungan ini.
‫Juga perlu permintaan tambalan, dan
‫kita perlu menentukan badan.
‫Dan saya ingin memulai dengan mengujinya, tentu
‫saja menyebabkan kesalahan ini, jadi mari
‫kita tentukan kata sandi, dan
‫kemudian sebuah nama.
‫Jadi katakanlah ini adalah nama yang ingin kita perbarui, jadi mari
‫kita simpan ini di sini.
‫Dan sebenarnya itu tentu saja ada di folder Users.
‫Data pengguna.
‫Dan sebenarnya mari kita buat folder
‫baru di sini, dan letakkan hal-hal yang terkait dengan otentikasi
‫ke dalam foldernya sendiri.
‫Jadi di sini,
‫kami membuat folder baru dan menyebutnya Otentikasi.
‫Itu tidak benar.
‫AH-KEMUDIAN-TICATION.
‫(terkekeh) Jadi begitu.
‫Jadi kata sandi terkait dengan
‫otentikasi, juga mengatur ulang kata sandi, lupa kata
‫sandi, masuk, dan keluar.
‫Jadi, mari kita tutup keduanya,
‫dan sekarang masuk sebagai, atau sebenarnya
‫mari buat pengguna baru.
‫Jadi mari daftar
‫di sini, sebagai pengguna biasa sehingga kami dapat menyingkirkan keduanya di sini.
‫Dan sekarang saya hanya menyebutnya, well, tes lagi, oke?
‫Dan mari kita lihat pengguna yang saat ini kita
‫miliki di database kita.
‫Jadi kita memiliki hello dan
‫admin, jadi sekarang mari kita gunakan test.
‫Dan saya selalu lagi, menggunakan kata sandi yang
‫sama untuk membuatnya sangat mudah.
‫Baiklah, kita perlu memberi nama juga, sebut saja
‫J di sini.
‫Dan sekarang memang kami mendapatkan token kami,
‫dan kami sudah masuk,
‫jadi sekarang ketika kami memperbarui pengguna,
‫itu seharusnya untuk pengguna yang baru saja masuk.
‫Jadi saya tidak mencoba memperbarui dan
‫tentu saja, belum ada pembaruan yang diterapkan dan itu tidak akan berhasil.
‫Yang ingin saya lihat adalah kesalahan yang seharusnya
‫terjadi karena saya menentukan properti kata sandi ini di sini di badan.
‫Jadi mari kita mencobanya.
‫Dan di sini kita mendapatkan kesalahan yang tampak aneh seperti
‫ini, tapi saya rasa itu hanya karena kita
‫tidak benar-benar memperbarui rute
‫di sini, jadi ingat saya baru saja menyalin rute, jadi URL-nya,
‫dan hanya menempelkannya di sini.
‫Tapi tentu saja, perlu updateME.
‫Jadi mari kita coba lagi.
‫Jadi sekarang kita benar-benar mendapatkan kesalahan yang kita tentukan.
‫"Rute ini bukan untuk pembaruan kata sandi.
‫"Silakan gunakan /updateMyPassowrd. " Sangat
‫bagus, bagian itu berfungsi, dan
‫itu juga berfungsi sehingga kita perlu diautentikasi.
‫Karena katakanlah kita tidak memiliki otentikasi, dan
‫katakanlah: Tidak Ada Auth.
‫Jadi mari kita coba lagi sekarang.
‫Dan memang, "Anda belum masuk!
‫"Silakan masuk untuk mendapatkan akses. " Jadi
‫hanya untuk membuktikan kepada Anda bahwa otentikasi kami
‫sebenarnya juga melakukan tugasnya di sini.
‫Tapi tentu saja, kami menginginkan Token Pembawa
‫kami, dan sekarang kami mendapatkan kesalahan lain itu.
‫Bagus, jadi sekarang mari
‫kita terapkan fungsionalitas lainnya untuk handler updateMe.
‫Jadi memperbarui dokumen pengguna, dan kami dapat mencoba
‫melakukannya dengan pengguna. aman.
‫Jadi seperti sebelumnya, pada dasarnya mendapatkan pengguna
‫kemudian memperbarui properti, dan pada
‫akhirnya, menyimpan dokumen.
‫Tetapi masalahnya adalah bahwa ada beberapa bidang
‫yang diperlukan yang tidak kami perbarui, dan
‫karena itu, kami
‫akan mengalami beberapa kesalahan.
‫Dan untuk menunjukkan kepada Anda dengan cepat,
‫izinkan saya melakukannya.
‫Oke, sangat cepat, mendapatkan pengguna di sini.
‫Jadi findbyId, jadi minta. pengguna seperti yang sudah kita ketahui, . Indo.
‫Dan kemudian katakanlah, pengguna. name = 'Jonas' dan kemudian menunggu
‫pengguna. menyimpan.
‫Tetapi sekali lagi Anda melihat bahwa ini akan memberi kita kesalahan.
‫Tapi untuk sekarang mari kita juga
‫mendeklarasikannya sebagai fungsi async.
‫Dan baiklah.
‫Jadi mari kita
‫uji sekarang, tetapi kita akan melihat kesalahan sekarang.
‫Jadi mari kita singkirkan yang
‫ini, dan memang kita mendapatkan: "Mohon konfirmasi kata sandi Anda".
‫Dan itu karena passwordConfirm adalah bidang yang wajib diisi tetapi
‫kami tentu saja tidak menentukannya.
‫Jadi metode aman bukanlah pilihan yang benar
‫dalam kasus ini.
‫Jadi yang bisa kita
‫lakukan sekarang adalah benar-benar menggunakan findById dan memperbarui.
‫Jadi kami tidak dapat menggunakannya sebelumnya karena semua alasan yang
‫saya jelaskan kepada Anda beberapa kali sekarang.
‫Tapi sekarang karena kita tidak berurusan
‫dengan kata sandi, tetapi hanya dengan data yang tidak sensitif ini
‫seperti nama atau email, kita sekarang dapat menggunakan findById dan memperbarui.
‫Jadi, mari kita singkirkan ini.
‫Sebut juga di sini updatedUser.
‫Dan kemudian di sini, kita harus melewati tidak hanya
‫ID, tetapi juga data yang harus diperbarui,
‫dan kemudian beberapa opsi.
‫Jadi datanya, sekarang mari kita sebut x di sini, dan
‫saya memberi tahu Anda
‫mengapa dalam sedetik, dan kemudian opsi yang ingin kita berikan.
‫Dan seperti sebelumnya, opsi
‫baru disetel ke true, sehingga mengembalikan objek
‫baru, jadi pada
‫dasarnya objek yang diperbarui, bukan yang lama.
‫Dan juga runValidators disetel ke true.
‫Karena memang kami ingin model memvalidasi dokumen kami.
‫Jadi misalnya, jika kita memasukkan alamat email yang tidak valid,
‫itu harus ditangkap oleh Validator dan mengembalikan kesalahan.
‫Sekarang mengapa saya meletakkan x di sini, dan bukan hanya meminta. tubuh?
‫Nah itu karena sebenarnya kita tidak
‫ingin mengupdate semua yang ada di
‫body, karena misalkan user meletakkan role misalnya
‫di body.
‫Kita bisa memiliki tubuh. peran disetel ke admin misalnya,
‫dan ini kemudian akan memungkinkan pengguna mana
‫pun untuk mengubah peran, misalnya, menjadi administrator.
‫Dan tentu saja itu tidak bisa dibiarkan.
‫Atau pengguna juga dapat mengubah token reset
‫mereka, atau ketika token reset berakhir,
‫dan semua itu tentu saja tidak boleh diizinkan.
‫Jadi melakukan sesuatu seperti ini tentu
‫saja akan menjadi kesalahan besar.
‫Jadi kita perlu memastikan bahwa objek
‫yang kita lewati di sini,
‫jadi sekali lagi objek yang akan berisi data
‫yang akan diupdate,
‫hanya berisi nama dan email, karena untuk
‫saat ini hanya ini yang ingin kita
‫izinkan untuk diupdate .
‫Jadi pada dasarnya kami ingin memfilter badan
‫sehingga pada akhirnya hanya berisi nama dan email dan tidak
‫ada yang lain.
‫Jadi jika kemudian pengguna mencoba mengubah peran,
‫itu akan disaring
‫sehingga tidak pernah menemukan jalannya ke database kami.
‫Jadi yang ingin kita lakukan pada dasarnya adalah membuat variabel
‫dan katakanlah filteredBody,
‫dan kemudian kita akan membuat fungsi dalam sedetik, tapi mari kita
‫gunakan di sini, supaya Anda melihat
‫bagaimana itu akan bekerja.
‫Dan kemudian di
‫sini kita melewatkan data, jadi objek yang
‫ingin kita filter, jadi req. body, karena di sanalah semua
‫data berada, lalu kami memberikan beberapa argumen.
‫Satu untuk setiap bidang yang ingin kita simpan
‫di objek.
‫Jadi kami ingin menyimpan bidang yang disebut
‫nama, dan bidang yang disebut email.
‫Dan lagi, beberapa saat kemudian kita mungkin menambahkan lebih banyak bidang
‫di sini, misalnya nanti kita mungkin
‫mengizinkan pengguna untuk mengunggah gambar.
‫Dan tentunya itu juga perlu kita
‫update di database.
‫Tapi untuk saat ini,
‫yang ingin kami simpan di badan adalah nama dan email dan memfilter sisanya.
‫Jadi di sini, sekarang mari kita gunakan
‫filteredBody, bukan x tentunya.
‫Dan sekarang yang perlu kita lakukan
‫adalah benar-benar mengimplementasikan fungsi ini yang akan menangani penyaringan objek.
‫Jadi mari kita lakukan itu di sini.
‫FilterObj,
‫yang akan mengambil objek dan
‫kemudian parameter lainnya untuk semua bidang yang diizinkan.
‫Jadi ini pada dasarnya akan
‫membuat array yang berisi semua argumen yang kita berikan.
‫Jadi pada dasarnya itu diteruskan setelah yang pertama ini.
‫Jadi dalam hal ini, itu adalah array yang berisi nama dan email.
‫Jadi yang perlu kita
‫lakukan sekarang pada dasarnya adalah mengulang objek dan untuk setiap elemen
‫memeriksa apakah itu salah satu bidang
‫yang diizinkan, dan jika ya, cukup tambahkan ke objek baru,
‫yang pada akhirnya akan kita kembalikan .
‫Dan mungkin ada cara yang lebih efisien dan lebih baik untuk
‫mengimplementasikan ini, tetapi mari
‫kita lakukan dengan sangat cepat di sini.
‫Jadi kita akan
‫mengulang objek dengan mengatakan Object. kunci dari objek yang kita lewati.
‫Jadi itulah salah satu cara mudah untuk
‫mengulang objek dalam JavaScript.
‫Jadi, this di sini pada dasarnya mengembalikan array
‫yang berisi semua nama
‫kunci, jadi nama bidang objek ini,
‫dan kemudian kita dapat mengulangnya.
‫Kemudian fungsi panggilan balik kami.
‫Dan untuk setiap elemen, inilah yang akan kita lakukan.
‫Jadi, jika larik bidang yang diizinkan menyertakan elemen
‫saat ini, jadi nama bidang saat ini, maka kami ingin
‫menambahkannya ke objek baru.
‫Jadi mari kita cepat membuat yang
‫itu di sini, jadi const newObj yang kosong
‫untuk saat ini, dan
‫pada akhirnya, itulah yang akan kita kembalikan.
‫Jadi baruObj.
‫Jadi jika bidang saat ini adalah salah satu
‫bidang yang diizinkan, maka newObj dengan nama bidang bidang saat ini, harus sama
‫dengan apa pun yang ada di objek pada elemen saat
‫ini, jadi nama bidang saat ini.
‫Jadi jangan jika ini terlihat
‫agak membingungkan, ini lagi-lagi hanya
‫JavaScript standar, tidak ada hubungannya tanpa JS atau eXpress
‫atau semacamnya.
‫Jadi sekali lagi, semua yang kita lakukan di sini pada dasarnya
‫adalah mengulang semua bidang yang ada di objek dan kemudian
‫untuk setiap bidang, kita memeriksa
‫apakah itu salah satu bidang yang diizinkan.
‫Dan jika ya, maka kita membuat bidang baru di objek baru, tentu
‫saja dengan nama
‫yang sama, jadi tetap beri nama elemen, dengan nilai yang
‫sama persis seperti yang ada di objek aslinya.
‫Dan kemudian pada akhirnya, kami mengembalikan yang itu.
‫Dan jadi ini sekarang semua harus bekerja di sini.
‫Maka yang perlu kita lakukan pada
‫akhirnya adalah mengirim pengguna yang diperbarui itu ke klien.
‫Jadi, pengguna.
‫Sekarang tentu saja, kita perlu meletakkan udadedUser lalu di
‫sini, simpan lagi, dan sekarang seharusnya berfungsi.
‫Se benar-benar apa yang kami lakukan di sini adalah..
‫perbarui pengguna terakhir, dan
‫sebelum kami melakukannya, kami sebenarnya memfilter nama bidang
‫yang tidak diinginkan yang tidak diizinkan untuk diperbarui.
‫Jadi mari kita coba sekarang.
‫Dan user ini disini adalah user biasa, jadi kita buat
‫saja dia,
‫ingat dengan nama J.
‫Jadi mari kita lihat Kompas.
‫Jadi itu pengguna biasa, dengan nama J.
‫Jadi sekarang mari
‫perbarui nama, dan juga coba perbarui
‫peran, yang lagi-lagi tidak diperbolehkan.
‫Tetapi untuk melihat apakah kode kita berfungsi, mari kita coba.
‫Jadi sudah ada namanya, dan katakanlah kami
‫adalah pengguna jahat
‫yang mencoba mengubah peran kami menjadi admin.
‫Jadi, saya rasa semuanya benar,
‫jadi mari kita kirim
‫ini sekarang, dan memang inilah objek yang diperbarui.
‫Jadi kami mendapatkan nama baru kami, yaitu Jonas Schmedtmann,
‫dan kemudian peran, yang masih pengguna.
‫Itu tidak memperbarui peran ke admin.
‫Sempurna. Itulah yang kami inginkan.
‫Jadi, simpan ini dan mari kita kembali dan sebenarnya dengan
‫ini kita baru saja menyelesaikan video ini.
‫Selanjutnya, kami kemudian akan menerapkan fungsi
‫menghapus pengguna saat ini.
‫Jadi kami bekerja untuk memperbarui, selanjutnya kami ingin mengizinkan pengguna untuk
‫pada dasarnya menghapus dirinya sendiri ketika dia tidak lagi
‫ingin menjadi bagian dari aplikasi kami.