Bluebird NPM: Janji Bluebird JS dengan Contoh
โก Ringkasan Cerdas
Bluebird JS adalah pustaka Promise berfitur lengkap untuk JavaSkrip yang kemampuan utamanya adalah promisifikasi: mengkonversi modul Node berbasis callback menjadi modul yang mengembalikan promise, sehingga seluruh pustaka seperti MongoDB Driver dapat digunakan secara asinkron.

Apa itu Bluebird JS?
Bluebird JS adalah pustaka Promise berfitur lengkap untuk JavaScript. Fitur terkuatnya adalah kemampuannya untuk "mempromisifikasi" modul Node lainnya agar dapat digunakan secara asinkron. Promisifikasi adalah konsep yang diterapkan pada fungsi callback, dan memastikan bahwa setiap fungsi callback yang dipanggil akan mengembalikan nilai.
Jadi jika a Node.js Modul ini berisi fungsi callback yang tidak mengembalikan nilai, dengan memberikan janji bahwa modul tersebut secara otomatis memodifikasi semua fungsi di dalamnya sehingga masing-masing fungsi mengembalikan nilai.
Ini berarti Anda dapat menggunakan Bluebird untuk membuat MongoDB Modul ini berjalan secara asinkron, yang menambah kemudahan saat menulis aplikasi Node.js.
Contoh di bawah ini pertama-tama membuat koneksi ke koleksi โEmployeeโ di database โEmployeeDBโ. Setelah koneksi terๅปบ็ซ, contoh ini mengambil semua catatan dalam koleksi tersebut dan menampilkannya di konsol.
Cara Menghasilkan Janji dengan Bluebird JS Library
Berikut adalah contoh langkah demi langkah yang menunjukkan cara menghasilkan promise dengan pustaka Bluebird JS.
Langkah 1) Menginstal modul NPM
Untuk menggunakan Bluebird dari dalam aplikasi Node, modul Bluebird diperlukan. Instal modul tersebut dengan perintah di bawah ini:
npm install bluebird
Langkah 2) Sertakan modul Bluebird
Langkah selanjutnya adalah menyertakan modul Bluebird dalam kode Anda dan melakukan promise pada keseluruhan proses. MongoDB Modul. Istilah "promisifikasi" di sini berarti Bluebird memastikan bahwa setiap metode yang didefinisikan di dalamnya MongoDB perpustakaan mengembalikan janji.
Code Penjelasan:
- The
requirePerintah tersebut menyertakan pustaka Bluebird. - Burung Biru
.promisifyAll()Metode ini membuat versi asinkron dari setiap metode. MongoDB Modul ini menyediakan fungsi-fungsi tertentu, sehingga masing-masing berjalan di latar belakang dan mengembalikan sebuah promise.
Langkah 3) Terhubung ke basis data
Langkah terakhir adalah terhubung ke basis data, mengambil semua catatan dalam koleksi, dan menampilkannya di log konsol.
Code Penjelasan:
- Perhatikan
connectAsyncmetode ini digunakan sebagai pengganti metode normal.connectmetode. Bluebird menambahkan Asinkron akhiran untuk setiap metode dalam MongoDB Pustaka ini membedakan panggilan yang mengembalikan promise dari panggilan yang tidak. Metode tanpa akhiran Async tidak memberikan jaminan tersebut. - Mirip dengan
connectAsync, yangfindAsyncMetode ini mengembalikan semua catatan dalam MongoDB Koleksi โKaryawanโ. - If
findAsyncSetelah berhasil diselesaikan, blok kode berikut akan mengulangi setiap catatan dalam koleksi dan menampilkannya di log konsol.
Jika langkah-langkah di atas dilakukan dengan benar, semua dokumen dalam koleksi Karyawan akan ditampilkan di konsol, seperti yang ditunjukkan pada output di bawah ini.
Berikut kode lengkapnya sebagai referensi:
var Promise = require('bluebird'); // promisifyAll adds an Async variant of every MongoDB method var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient; mongoClient.connectAsync('mongodb://localhost/EmployeeDB') .then(function(db) { return db.collection('Employee').findAsync({}); }) .then(function(cursor) { cursor.each(function(err, doc) { console.log(doc); }); });
โ ๏ธ Catatan versi driver: Kode di atas menargetkan... MongoDB Driver Node 2.x, di mana connect diselesaikan dengan objek basis data. Dari driver 3.0 ke depan ini diselesaikan dengan MongoClient, jadi rantai tersebut harus memanggil client.db('EmployeeDB').collection('Employee') alih-alih db.collection('Employee')Versi driver modern juga sudah mengembalikan promise bawaan, yang membuat promisifyAll tidak perlu untuk MongoDB secara khusus.
Bluebird vs Native Promises: Mana yang Harus Digunakan?
Saat Bluebird pertama kali ditulis, Node sama sekali tidak mendukung promise, sehingga library ini mengisi celah yang benar-benar ada di platform tersebut. Node telah menyertakan promise bawaan sejak versi 4 dan seterusnya. async/await sejak versi 7.6, yang mengubah perhitungan secara signifikan bagi siapa pun yang memulai proyek saat ini.
| Aspek | Bluebird | Janji Asli |
|---|---|---|
| Ketergantungan | Sebuah paket npm untuk diinstal dan dipelihara. | Terintegrasi ke dalam runtime. |
| Memberikan janji pada callback | promisifyAll() mengkonversi seluruh modul |
util.promisify() mengubah satu fungsi |
| Pembantu tambahan | peta, filter, properti, masing-masing, batas waktu, pembatalan | semua, semua menetap, apa pun, hanya ras |
| Tumpukan panjang traces | Ya, jika diaktifkan. | Lebih baik tetapi lebih pendek |
| Terbaik untuk | Pustaka callback lama, pembantu konkurensi | Kode baru, dan apa pun yang menggunakan async await |
Pilih promise bawaan untuk pekerjaan baru, karena promise tidak memerlukan dependensi dan terintegrasi langsung dengan async await. Gunakan Bluebird ketika dependensi masih hanya mengekspos callback, atau ketika helper konkurensinya, seperti Promise.map Dengan batasan konkurensi, hematlah sejumlah kode yang signifikan.
Cara Menangani Kesalahan dengan Bluebird Promises
Contoh di atas tidak memiliki jalur kegagalan. Jika MongoDB Jika promise tidak berjalan, atau nama koleksinya salah, rantai promise ditolak dan tidak ada yang dicetak โ proses tersebut langsung keluar tanpa penjelasan. Setiap rantai promise membutuhkan penangan terminal.
Bluebird mendukung .catch() untuk penolakan dan .finally() untuk pembersihan yang harus dijalankan dalam kondisi apa pun. Ini juga mendukung penanganan kesalahan bertipe, yang menangani satu kelas kesalahan sementara membiarkan kelas kesalahan lainnya menyebar.
var Promise = require('bluebird'); var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient; var connection; mongoClient.connectAsync('mongodb://localhost/EmployeeDB') .then(function(db) { connection = db; return db.collection('Employee').findAsync({}); }) .then(function(cursor) { return cursor.toArrayAsync(); }) .then(function(docs) { docs.forEach(function(doc) { console.log(doc); }); }) .catch(Promise.TimeoutError, function(err) { console.error('The database did not respond in time.'); }) .catch(function(err) { // Any other rejection from any step above arrives here console.error('Query failed:', err.message); }) .finally(function() { // Runs on success and on failure, so the socket always closes if (connection) { connection.close(); } });
Tiga kebiasaan penting di sini. Pertama, tempatkan .catch() di bagian akhir, bukan setelah setiap langkah, karena satu penangan terminal menerima penolakan dari setiap tautan sebelumnya dalam rantai. Kedua, gunakan .finally() untuk melepaskan sumber daya seperti koneksi basis data, karena berjalan pada jalur sukses dan gagal. Ketiga, jangan pernah meninggalkan rantai tanpa penanganan: penolakan yang tidak ditangani akan menghentikan proses Node pada versi saat ini, dan Bluebird akan mencetak peringatan eksplisit tentang hal itu sebelumnya. Mengaktifkan tumpukan panjang traces selama pengembangan dengan Promise.config({ longStackTraces: true }) membuat asal muasal penolakan jauh lebih mudah ditemukan.
Kesalahan dan Perbaikan Janji Burung Biru Biasa
Sebagian besar masalah Bluebird berasal dari konvensi penamaan yang menggunakan promise, atau dari pencampuran gaya pemanggilan callback dan promise dalam rantai yang sama, bukan dari kesalahan pada library itu sendiri. Setiap gejala di bawah ini menyebutkan penyebab dan solusinya.
- โconnectAsync bukanlah sebuah fungsiโ: Modul tersebut dibutuhkan secara langsung, bukan melalui
promisifyAll(), jadi tidak ada varian Async. Bungkus panggilan require seperti yang ditunjukkan di atas. - Memanggil metode biasa dan mendapatkan undefined:
connect()masih mengharapkan callback. Hanya salinan dengan akhiran Async yang mengembalikan promise. - Meneruskan fungsi callback ke metode Async: tidak menyediakan panggilan balik maupun
awaitdan promise tersebut tidak teramati. Gunakan satu gaya per panggilan, bukan keduanya. - menggunakan `promisifyAll` pada pustaka yang sudah berbasis promise: Tidak berbahaya tetapi tidak ada gunanya, dan menghasilkan nama dengan akhiran ganda yang membingungkan. Periksa dokumentasi pustaka terlebih dahulu.
- Kehilangan kesalahan secara diam-diam: rantai tanpa
.catch()Menyembunyikan alasan penolakan hingga Node melaporkan penolakan yang tidak ditangani dan keluar. Selalu akhiri rantai dengan blok catch, bahkan dalam skrip pendek.



