‫Instruktur: Jadi, sekarang
‫kita perlu mengirim token reset kata sandi melalui email ke pengguna.
‫Jadi dalam kuliah ini, kita akan
‫belajar cara mengirim email menggunakan solusi yang sangat populer
‫yang disebut Nodemailer.
‫Tetapi sebelum kita melakukannya, saya sebenarnya ingin
‫menunjukkan kepada Anda efek dari tidak adanya opsi ini di sini,
‫karena sebenarnya saya tidak pernah menunjukkannya kepada Anda sebelumnya.
‫Jadi mari kita potong di sini, coba sekarang, lagi,
‫dan sekarang Anda melihat semua kesalahan ini muncul
‫seperti tolong konfirmasikan kata sandi Anda.
‫Dan, sebenarnya, seharusnya ada lebih
‫banyak lagi, tapi, yah, ini yang pertama Anda dapatkan.
‫Pada dasarnya, karena kami tidak memiliki
‫nilai apa pun di bidang konfirmasi kata sandi.
‫Oke?
‫Dan sekali lagi, itu karena validasi dan
‫sekali lagi kita dapat, tentu saja, dengan mudah
‫mematikannya dengan opsi ini.
‫Tapi bagaimanapun, sekarang mari kita buat fungsi pengendali email yang
‫kemudian dapat kita gunakan di seluruh aplikasi kita.
‫Jadi saya
‫akan melakukannya di sini di
‫folder Utilities, lagi, dan menyebutnya email. js.
‫Baiklah?
‫Dan sebelum kita melakukan
‫hal lain, mari kita instal paket Nodemailer.
‫Jadi itulah paket yang saya sebutkan di
‫awal, yang akan kita
‫gunakan untuk mengirim email menggunakan Node.js. js.
‫Jadi, seperti biasa, npm install nodemailer.
‫Dan di sini.
‫Baiklah, dan sekarang mari kita buat fungsi itu di sini.
‫Jadi email yang konstan,
‫oke, dan kemudian
‫di sini, kami akan memberikan beberapa opsi pada dasarnya.
‫Jadi alamat email tempat kita ingin mengirim
‫email, baris subjek, konten email, dan
‫mungkin beberapa hal lainnya.
‫Baiklah.
‫Jadi sekarang kita perlu mengikuti
‫tiga langkah untuk mengirim email dengan Nodemailer.
‫Jadi pertama-tama, kita perlu membuat transporter.
‫Kemudian
‫kedua, kita perlu menentukan opsi email, pada dasarnya,
‫dan pada
‫akhirnya, benar-benar mengirim email dengan Nodemailer.
‫Oke?
‫Jadi, transporter yang kita buat pada langkah pertama
‫di sini, pada dasarnya adalah sebuah layanan yang sebenarnya akan mengirim email,
‫karena bukan node. js yang sebenarnya
‫akan mengirim email itu sendiri.
‫Ini hanya layanan yang kami definisikan di sini.
‫Sesuatu seperti Gmail, misalnya.
‫Sekarang, Gmail sebenarnya bukan layanan
‫yang akan
‫kita gunakan, tapi izinkan saya menunjukkan
‫cara kerjanya dengan Gmail, karena saya tahu
‫banyak orang akan tertarik dengan ini, oke?
‫Jadi, bagaimanapun, kita harus selalu membuat transporter, dan itu selalu sama, tidak
‫peduli layanan
‫apa yang akan kita gunakan.
‫Jadi transporter akan menjadi
‫nodemailer. createTransport dan
‫kemudian, tentu saja, kita memerlukan beberapa opsi di sana.
‫Baiklah?
‫Jadi kami dapat menentukan layanan dan kami dapat
‫mengatakan bahwa kami ingin menggunakan Gmail.
‫Jadi, seperti ini.
‫Dan ada beberapa layanan terkenal
‫yang Nodemailer tahu bagaimana menanganinya, jadi
‫kita tidak perlu mengonfigurasinya secara manual.
‫Dan Gmail hanyalah salah satunya.
‫Tapi juga ada Yahoo, atau Hotmail, atau banyak lainnya, oke?
‫Jadi itulah
‫layanannya, dan kemudian kita juga perlu menentukan properti auth, jadi
‫pada dasarnya untuk otentikasi.
‫Jadi kita membutuhkan user dan password.
‫Dan seperti sebelumnya, kami menyimpan
‫hal-hal semacam itu di konfigurasi kami. n berkas.
‫Baiklah.
‫Jadi email,
‫itu nama pengguna,
‫dan sekarang saya tidak akan menggunakan alamat Gmail
‫asli di sini karena, sekali lagi,
‫kami tidak menggunakan Gmail, tetapi hanya sebagai contoh di sini, oke.
‫Kata sandi Anda.
‫Baiklah.
‫Jadi di sini kita selesai,
‫katakanlah,
‫proses dot end dot
‫EMAIL_USERNAME proses
‫sandi dot end dot EMAIL_PASSWORD
‫dan saya harap
‫saya mengejanya dengan benar.
‫Oke?
‫Dan ini
‫adalah konfigurasi untuk transport di Nodemailer.
‫Kemudian di akun Gmail Anda,
‫Anda benar-benar harus
‫mengaktifkan sesuatu yang disebut opsi aplikasi yang kurang aman.
‫Jadi izinkan saya menuliskannya di sini.
‫Dan sekali lagi, saya tidak akan melakukannya
‫di sini, tetapi saya
‫tahu bahwa banyak orang akan benar-benar ingin menggunakannya.
‫Dan alasan mengapa kami tidak menggunakan Gmail
‫dalam aplikasi ini adalah
‫karena Gmail sama sekali bukan ide yang baik
‫untuk aplikasi produksi.
‫Dan pada dasarnya itulah yang kami coba bangun di sini.
‫Oke?
‫Jadi menggunakan Gmail untuk hal semacam
‫ini, Anda hanya dapat mengirim 500 email per
‫hari, dan juga, Anda mungkin akan dengan
‫cepat ditandai sebagai spammer, dan dari sana, itu hanya akan menurun.
‫Baiklah?
‫Jadi, kecuali itu seperti aplikasi pribadi, dan
‫Anda hanya mengirim email ke
‫diri sendiri, atau, seperti,
‫10 teman, ya, Anda harus menggunakan layanan lain.
‫Dan beberapa yang terkenal adalah SendGrid dan Mailgun.
‫Dan, sebenarnya, kita akan menggunakan SendGrid nanti
‫dalam kursus ini.
‫Sekarang, yang akan kita lakukan
‫sekarang adalah menggunakan layanan pengembangan khusus,
‫yang pada dasarnya palsu untuk mengirim email ke alamat asli.
‫Namun, pada kenyataannya, email-email ini akhirnya terjebak
‫dalam kotak masuk pengembangan, sehingga kami dapat melihat
‫bagaimana tampilannya nanti dalam produksi.
‫Baiklah?
‫Jadi layanan itu disebut Mailtrap, jadi sekarang
‫mari kita mendaftar untuk itu.
‫Jadi.
‫Perangkap surat. io, oke?
‫Jadi, dan seperti yang saya katakan, pengujian email
‫yang aman untuk staging dan pengembangan.
‫Jadi pada dasarnya,
‫dengan layanan ini, Anda dapat memalsukan untuk mengirim email ke
‫klien, tetapi email ini tidak akan pernah sampai
‫ke klien ini, dan malah terjebak di Mailtrap Anda, oke?
‫Dan dengan demikian Anda
‫tidak dapat secara tidak sengaja mengirim beberapa email pengembangan
‫ke semua klien atau pengguna Anda, oke.
‫Jadi pergi ke depan dan mendaftar sekarang.
‫Saya, tentu saja, sudah memiliki akun saya,
‫jadi saya akan masuk sekarang.
‫Jadi sampai jumpa lagi, setelah
‫Anda membuat akun gratis.
‫Baiklah, jadi setelah membuat akun
‫Anda, mungkin akan terlihat sedikit seperti ini.
‫Sekarang, Anda tidak akan memiliki kotak masuk untuk
‫saat ini, jadi mari kita buat yang baru,
‫dengan nama natours.
‫Jadi, saya sudah punya satu, tapi buat yang baru di
‫sini, dengan nama natours, lalu tekan Create Inbox.
‫Baiklah?
‫Kemudian kami dapat membukanya,
‫dan Anda melihat kami tidak memiliki email pada saat
‫ini, tetapi yang penting untuk
‫saat ini adalah kredensial ini di sini.
‫Jadi Anda lihat kami memiliki host kami
‫di sini, kami memiliki port, nama pengguna, dan kata sandi.
‫Dan itulah yang akan kita
‫tentukan dalam transport kita di Nodemailer sekarang.
‫Baiklah?
‫Jadi mari kita mulai dengan host,
‫sebenarnya, dengan
‫nama pengguna, jadi dua ini, saya
‫hanya perlu menyalin jadi mari kita salin ke file konfigurasi
‫kita, jadi itu nama pengguna, lalu
‫itu kata sandi, dan
‫sekarang kita sebenarnya juga perlu tentukan tuan rumah.
‫Oke, dan itu karena Mailtrap bukan salah
‫satu dari layanan standar yang disertakan dengan Nodemailer.
‫Baiklah.
‫Pelabuhannya 25.
‫Jadi simpan saja, dan
‫kemudian di sini, mari kita singkirkan ini, dan
‫yang perlu saya tentukan sebagai gantinya adalah
‫host
‫jadi email, host,
‫dan, tentu saja, port.
‫Jadi semua yang baru saja kita simpan sebelumnya.
‫Baiklah, maka otentikasi di sini
‫sama persis.
‫Mari kita singkirkan ini
‫juga, dan lanjutkan ke langkah nomor dua.
‫Jadi pada dasarnya mendefinisikan beberapa opsi untuk email kita.
‫Baiklah, dan kita tentu saja dapat
‫melakukan langkah kedua dan ketiga secara bersamaan, tetapi saya
‫lebih suka memilih opsi ini di sini terlebih dahulu.
‫Oke, jadi di sini kita
‫tentukan dari mana email
‫itu berasal,
‫jadi namanya, lalu alamat emailnya seperti ini.
‫Selanjutnya, kita memerlukan alamat penerima,
‫dan yang itu, saya akan tentukan sebagai opsi,
‫oke?
‫Jadi pada dasarnya, datang sebagai argumen untuk fungsi ini.
‫Jadi objek opsi ini di sini,
‫apakah ini yang kita masukkan ke dalam fungsi.
‫Baiklah.
‫Kemudian sebenarnya sama untuk subjek dan untuk teks.
‫Mari kita gandakan
‫ini di sini, Jadi subjek
‫dan kemudian kita hanya menentukan properti teks,
‫dan yang itu, dalam opsi, saya menyebutnya pesan.
‫Baiklah, jadi yang ini pada dasarnya adalah
‫versi teks dari email.
‫Tapi kita juga bisa menentukan properti HTML.
‫Oke, jadi sekarang kita bisa mengonversi pesan ini ke HTML.
‫Dan nanti, kita akan melakukan itu, tapi
‫untuk saat ini, mari kita tetap sederhana dan tidak menentukan HTML di sini, sama sekali.
‫Oke?
‫Jadi cukup tinggalkan di teks.
‫Oke!
‫Dan akhirnya, pada
‫akhirnya, transporter, jadi itulah objek transporter yang kita buat
‫di sini di awal, dan di
‫atasnya, kita bisa memanggil sendMail
‫dan ke dalamnya kita harus memasukkan opsi email kita, oke?
‫Dan sekarang ini benar-benar mengembalikan Janji.
‫Oke, sekali lagi, ini adalah fungsi asinkron,
‫dan karena kita tidak ingin langsung bekerja dengan Promises,
‫mari gunakan async/await.
‫Baiklah.
‫Jadi mendeklarasikan ini sebagai fungsi async
‫dan begitulah.
‫Baiklah.
‫Kami tidak ingin menyimpan hasil apa pun
‫di sini, yang kami bisa, tetapi saya tidak terlalu tertarik dengan itu.
‫Oke, dan sekarang mari kita ekspor sebagai
‫default dari modul ini.
‫Oke, terlihat bagus!
‫Sekarang mari kita lanjutkan dan benar-benar mencoba ini.
‫Dan untuk memulai, kita perlu mengimpornya di sini, tentu saja.
‫Jadi mari kita gandakan
‫ini
‫di sini, jadi ini email, dan fungsinya disebut sendEmail.
‫Oke.
‫Jadi mari kita kembali ke fungsi middleware kita di sini, dan
‫mari kita mulai dengan mendefinisikan URL reset.
‫Jadi, idealnya, pengguna kemudian mengklik email ini dan
‫kemudian dapat melakukan permintaan dari sana.
‫Dan itu akan
‫berfungsi nanti saat kami menerapkan situs web
‫dinamis kami, tetapi tetap saja, kami sekarang ingin membuat URL ini
‫di sini, sehingga pengguna dapat dengan mudah
‫menyalinnya, untuk mempermudah melakukan permintaan ini.
‫Oke, jadi pada dasarnya kita perlu
‫membuat ulang struktur URL yang kita miliki di sini.
‫Jadi yang ini untuk lupa kata sandi dan
‫mari kita simpan di sini.
‫Jadi, lupa password, dan sekarang URL yang kita
‫buat sebenarnya untuk reset password.
‫Jadi, ingat, kami benar-benar menerapkan yang itu sebelumnya.
‫Oke.
‫Mari kita lanjutkan dan
‫salin di sini, jadi setel ulang kata sandi, oke?
‫Dan itu kemudian akan benar-benar mengambil
‫token sebagai parameter.
‫Oke, jadi mari kita taruh token acak di sini untuk saat ini.
‫Jadi tidak masalah sama sekali.
‫Biar
‫saya simpan saja disini, sebagai reset password.
‫Oke.
‫Dan juga, ini bukan GET, juga
‫bukan POST, tetapi PATCH, karena
‫hasil dari ini adalah modifikasi properti kata
‫sandi di dokumen pengguna.
‫Dan sebenarnya PATCH adalah yang terbaik, oke?
‫Jadi mari kita cepat mengubah implementasi rute kita untuk ini.
‫Jadi, ini ada di userRoute, jadi ini
‫bukan POST, ini PATCH,
‫dan kami juga ingin menentukan parameter.
‫Jadi, ingat bagaimana kita melakukannya.
‫Jadi seperti di bawah sini.
‫Jadi garis miring lagi kemudian titik dua, dan
‫kemudian nama parameternya, yang akan menjadi token.
‫Oke, dan mari kita
‫buat ini sekarang, dimulai dengan protokolnya.
‫Jadi, HTTP atau HTTPS, oke?
‫Dan pada dasarnya kami akan mendapatkan data itu dari permintaan kami.
‫Jadi itu disimpan pada protokol titik
‫permintaan lalu garis miring titik dua, dan kemudian tuan rumah, oke?
‫Jadi kami pada dasarnya mempersiapkan yang satu ini di
‫sini untuk bekerja baik dalam pengembangan maupun produksi.
‫Jadi, minta dot get, lalu
‫host.
‫Baiklah, jadi beginilah cara kita mendapatkan
‫host, lalu slash api slash versi satu, dan saya rasa tidak
‫ideal untuk mendefinisikan tier hardcoded seperti ini,
‫tapi sekali
‫lagi, ini adalah sesuatu yang
‫akan kita perbaiki nanti, Oke?
‫Dan saya melihat bahwa ini sebenarnya tidak benar.
‫Kurung kurawal ini harus ada di sana.
‫Jadi, sekarang, pengguna,
‫resetPassword,
‫dan kemudian tebasan lagi, dan akhirnya token.
‫Oke, jadi, resetToken.
‫Baiklah?
‫Dan seperti yang telah kita diskusikan sebelumnya, dalam
‫kuliah terakhir, di
‫sini kita sebenarnya harus mengirim Token reset asli yang polos, dan bukan yang terenkripsi.
‫Baiklah?
‫Kami kemudian akan,
‫pada langkah berikutnya, membandingkan token asli dengan yang dienkripsi.
‫Jadi, sekali lagi, seperti yang kita bahas di video terakhir.
‫Simpan di sini sekarang, dan itu adalah URL reset kami.
‫Dan sekarang, berdasarkan URL ini, mari kita cepat membuat
‫pesan di sini juga.
‫Jadi, Lupa kata sandi Anda?
‫Kirim permintaan PATCH dengan kata sandi dan kata sandi
‫baru Anda. Konfirmasikan tentu saja,
‫ke URL reset
‫yang baru saja kita buat, oke?
‫Jadi pada dasarnya, memberi pengguna beberapa instruksi di sini.
‫Kemudian, di baris baru, kami
‫juga mengatakan, jika Anda tidak lupa kata sandi Anda,
‫abaikan email ini.
‫Jadi itu semacam pesan umum, dan sekali
‫lagi, saya yakin Anda telah melihatnya dalam beberapa cara
‫atau yang lain, baiklah.
‫Jadi sekarang, akhirnya, mengirim email, dan
‫ingat bahwa sendEmail adalah
‫fungsi asinkron.
‫Jadi, oleh karena itu, kita perlu menunggunya di sini.
‫Oke?
‫Karena, tentu saja, itu akan mengembalikan Janji.
‫Dan ingat sekarang bahwa fungsi sendEmail di sini
‫mengambil objek dengan beberapa opsi.
‫Jadi email adalah pengguna. email, kan?
‫Atau kita juga bisa mengatakan, req. tubuh. surel.
‫Jadi sebenarnya sama saja, kan?
‫Kemudian subjek yang ingin
‫kami sampaikan adalah, Token reset kata sandi Anda.
‫Katakanlah langsung bahwa itu hanya berlaku selama
‫10 menit, sehingga pengguna tahu bahwa dia harus bergegas.
‫Oke, dan akhirnya, pesannya juga.
‫Oke.
‫Jadi, kami menunggu itu, dan
‫kemudian setelah itu, mari kita juga mengirim, tentu saja, beberapa tanggapan.
‫Oke, jadi selalu perlu ada tanggapan, jika
‫tidak, seperti yang sudah
‫Anda ketahui, siklus permintaan/tanggapan tidak akan pernah selesai.
‫Jadi kami cukup mengirim kode
‫200 dan kemudian pesan yang diformat dengan
‫baik dengan status
‫sukses, dan kemudian hanya pesan
‫singkat yang mengatakan, Token terkirim ke email.
‫Baiklah.
‫Dan, tentu saja, kami tidak dapat mengirim token reset di sini, dengan
‫berdekatan, kan, karena, setiap orang dapat dengan mudah mereset kata
‫sandi siapa pun, dan mengambil
‫alih akun apa pun yang mereka inginkan.
‫Dan itulah seluruh alasan mengapa kami mengirimkannya
‫ke alamat email, karena kami berasumsi
‫bahwa email adalah tempat yang
‫aman, yang hanya dapat diakses oleh pengguna.
‫Baiklah.
‫Whoo, jadi, video ini, lagi-lagi berjalan cukup lama, tapi
‫kita masih belum selesai.
‫Kami hampir selesai, tetapi tidak sepenuhnya,
‫karena mungkin terjadi kesalahan,
‫menggunakan sendEmail ini, oke, dan dalam hal ini, kami,
‫tentu saja, ingin mengirim pesan kesalahan ke klien.
‫Namun dalam kasus ini, kita sebenarnya perlu melakukan
‫lebih dari sekadar mengirim pesan kesalahan.
‫Pada dasarnya kita perlu mengatur kembali token reset kata
‫sandi dan reset kata sandi kedaluwarsa yang telah kita tentukan, oke?
‫Jadi saat ini tidak cukup hanya
‫dengan menangkap kesalahan dan
‫mengirimkannya ke middleware penanganan kesalahan global kami.
‫Tapi sebaliknya kita hanya perlu menambahkan
‫blok try-catch di sini.
‫Jadi sekali lagi, karena kami
‫sebenarnya ingin melakukan lebih dari sekadar mengirim kesalahan
‫ke klien, jadi pada dasarnya kami mencoba
‫melakukan ini, benar, tetapi jika ada kesalahan,
‫tentu saja, blok ini di sini dijalankan.
‫Baiklah?
‫Jadi apa yang ingin kami lakukan dalam
‫kasus itu, pada dasarnya kami ingin,
‫seperti yang saya katakan, mengatur ulang token dan properti kedaluwarsa.
‫Oke.
‫Jadi, passwordResetToken,
‫dan setel ke undefined, oke.
‫Dan hal yang sama untuk passwordResetExpires.
‫Oke.
‫Dan kemudian, tentu saja,
‫seperti sebelumnya, ini hanya mengubah data, tetapi tidak benar-benar menyimpannya.
‫Jadi mari kita tambahkan, ambil yang
‫ini, dan pada dasarnya menyimpan data dalam kasus ini.
‫Oke, dan kemudian hanya untuk
‫menyelesaikan, tentu saja, kami kembali dengan kesalahan ke
‫middleware berikutnya.
‫Jadi
‫newAppError, Terjadi kesalahan saat mengirim email.
‫Coba lagi nanti.
‫Dan dalam hal ini, kode kesalahan sebenarnya bisa menjadi 500.
‫Jadi ini benar-benar, seperti kesalahan yang terjadi di
‫server, dan itu harus berupa lima
‫kode, dan 500 hanya, seperti, kode standar.
‫Baiklah.
‫Jadi, sekarang mari kita lanjutkan dan coba ini lagi, oke.
‫Jadi ini cukup panjang lagi, tapi, yah, kita
‫harus melakukannya, kan?
‫Jadi, lupa kata sandi, dengan email ini, mari kita periksa.
‫Jadi ini mungkin tidak
‫memakan waktu lama, karena mengirim email,
‫tetapi sebenarnya itu berhasil sekarang, butuh waktu lima detik, tetapi
‫kami melihat Token dikirim ke email.
‫jadi, seperti yang kita ketahui, karena kita menggunakan Mailtrap, sebenarnya
‫email ini tidak dikirim ke hello@jones. io tetapi
‫emailnya sekarang harus terjebak
‫di dalam Mailtrap.
‫Dan, memang, di sini di sisi kiri, sekarang muncul.
‫Baiklah.
‫Jadi, itulah email yang kami tentukan dan di sini
‫kami mendapatkan URL bagus kami.
‫Oke, jadi yang kita buat dengan protokol, host,
‫dan kemudian juga dengan token.
‫Jadi mari kita lihat apakah
‫ini benar-benar
‫token biasa kita, jadi
‫berakhiran 88df, dan memang, kita telah meresetToken di sini, 88df.
‫Dan sekarang di database, kita
‫harus memiliki token yang diakhiri dengan 1111.
‫Jadi, mari kita pastikan bahwa,
‫di sini, di Kompas, muat ulang, dan, memang, ini dia, oke?
‫Dan sekali lagi, ini dalam 10 menit dari sekarang.
‫Bagus, jadi kami menyelesaikan bagian itu.
‫Selanjutnya di video selanjutnya kita
‫sebenarnya akan mereset
‫password, tentunya berdasarkan password baru
‫yang dikirimkan pengguna dengan permintaan reset password.
‫Jadi, sampai jumpa disana.