Bluebird NPM: Örnekle Bluebird JS Vaadi
⚡ Akıllı Özet
Bluebird JS, Promise tabanlı, tam özellikli bir kütüphanedir. JavaTanımlayıcı özelliği promise'leştirme olan betik: geri çağrı tabanlı Node modüllerini promise döndüren modüllere dönüştürmek, böylece tüm bir kütüphaneyi, örneğin... MongoDB Sürücü eşzamansız olarak kullanılabilir.

Bluebird JS nedir?
Bluebird JS, Promise tabanlı, tam özellikli bir kütüphanedir. JavaBetik. En güçlü özelliği, diğer Node modüllerini eşzamansız olarak kullanabilmek için "promisify" etmenize olanak sağlamasıdır. Promisify, geri çağırma fonksiyonlarına uygulanan bir kavramdır ve çağrılan her geri çağırma fonksiyonunun bir değer döndürmesini sağlar.
Yani eğer bir node.js Bu modül, değer döndürmeyen bir geri çağırma fonksiyonu içerir ve bu da modülün içindeki tüm fonksiyonları otomatik olarak değiştirerek her birinin bir değer döndürmesini sağlar.
Bu, Bluebird'ü kullanarak şunları yapabileceğiniz anlamına gelir: MongoDB Bu modül eşzamansız olarak çalışır, bu da Node.js uygulamaları yazarken kolaylık sağlayan bir diğer unsurdur.
Aşağıdaki örnek, öncelikle "EmployeeDB" veritabanındaki "Employee" koleksiyonuna bir bağlantı kurar. Bağlantı kurulduktan sonra, koleksiyondaki tüm kayıtları alır ve konsolda görüntüler.
Bluebird JS Kütüphanesi ile Vaatler Nasıl Üretilir?
İşte Bluebird JS kütüphanesi ile promise'ler oluşturmanın adım adım bir örneği.
Adım 1) NPM modüllerinin kurulumu
Node uygulaması içinden Bluebird'ü kullanmak için Bluebird modülü gereklidir. Aşağıdaki komutla kurabilirsiniz:
npm install bluebird
Adım 2) Bluebird modülünü ekleyin
Bir sonraki adım, Bluebird modülünü kodunuza dahil etmek ve tüm işlemi promise tabanlı hale getirmektir. MongoDB modül. Burada vaat etmek, Bluebird'ün modülde tanımlanan her yöntemin çalışmasını sağlaması anlamına gelir. MongoDB kütüphane bir söz verir.
Code Açıklama:
- MKS
requireBu komut Bluebird kütüphanesini içerir. - Mavi kuşun
.promisifyAll()Bu yöntem, her yöntemin eşzamansız bir sürümünü oluşturur. MongoDB Bu modül, her birinin arka planda çalışmasını ve bir promise döndürmesini sağlar.
Adım 3) Veritabanına bağlanın
Son adım, veritabanına bağlanmak, koleksiyondaki tüm kayıtları almak ve bunları konsol günlüğünde görüntülemektir.
Code Açıklama:
- Dikkat
connectAsyncnormal yöntem yerine yöntem kullanılır.connectBluebird yöntemi ekler. zaman uyumsuz her bir yöntemin sonuna eklenen sonek MongoDB Promise döndüren çağrıları, döndürmeyenlerden ayırt etmek için kullanılan bir kütüphane. Async soneki olmayan metotlar böyle bir garanti sağlamaz. - Benzer
connectAsync,findAsyncBu yöntem, kayıtların tümünü döndürür. MongoDB “Çalışan” koleksiyonu. - If
findAsyncİşlem başarıyla tamamlandığında, aşağıdaki kod bloğu koleksiyondaki her kaydı tek tek inceler ve konsol günlüğünde görüntüler.
Yukarıdaki adımlar doğru şekilde gerçekleştirilirse, Çalışan koleksiyonundaki tüm belgeler aşağıdaki çıktıda gösterildiği gibi konsolda görüntülenir.
İşte referans olması için kodun tamamı:
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); }); });
⚠️ Sürücü sürümü notu: Yukarıdaki kod şu hedefleri hedefliyor: MongoDB Node sürücüsü 2.x, burada connect Veritabanı nesnesiyle çözümlenir. Sürücüden. 3.0 ileri Bu, bir çözümle sonuçlanıyor. MongoClientBu nedenle zincirin arama yapması gerekiyor. client.db('EmployeeDB').collection('Employee') yerine db.collection('Employee')Modern sürücü sürümleri zaten yerel vaatler de döndürüyor, bu da promisifyAll için gereksiz MongoDB Özellikle.
Bluebird mi, Native Promises mi: Hangisini Kullanmalı?
Bluebird ilk yazıldığında, Node'da hiç promise desteği yoktu, bu nedenle kütüphane platformdaki gerçek bir boşluğu doldurdu. Node, 4. sürümünden beri yerel promise'leri sunuyor ve async/await 7.6 sürümünden bu yana, bugün bir projeye başlayan herkes için hesaplama önemli ölçüde değişiyor.
| Görünüş | Bluebird | Yerli Vaatleri |
|---|---|---|
| Bağımlılık | Kurulumu ve bakımı kolay bir npm paketi. | Çalışma zamanına entegre edilmiştir. |
| Umut vadeden geri aramalar | promisifyAll() bir modülün tamamını dönüştürür |
util.promisify() bir fonksiyonu dönüştürür |
| Ek yardımcılar | harita, filtre, özellikler, her biri, zaman aşımı, iptal | tümü, tümü Yerleşik, herhangi biri, sadece ırk |
| Uzun yığın traces | Evet, etkinleştirildiğinde. | Geliştirilmiş ama daha kısa |
| İçin en iyisi | Eski geri çağırma kütüphaneleri, eşzamanlılık yardımcıları | Yeni kod ve async await kullanan her şey |
Yeni işler için yerel promise'leri tercih edin, çünkü bunlar herhangi bir bağımlılığa ihtiyaç duymaz ve async await ile doğrudan entegre olur. Bağımlılık yalnızca callback'leri ortaya çıkarıyorsa veya eşzamanlılık yardımcıları (örneğin, ...) gerekiyorsa Bluebird'e başvurun. Promise.map Eşzamanlılık sınırı belirleyerek önemli miktarda kod tasarrufu sağlayabilirsiniz.
Bluebird Promise'lerinde Hatalarla Nasıl Başa Çıkılır?
Yukarıdaki örnekte hata yolu bulunmamaktadır. Eğer MongoDB Eğer işlem çalışmıyorsa veya koleksiyon adı yanlışsa, zincir reddedilir ve hiçbir şey yazdırılmaz; işlem hiçbir açıklama yapılmadan sona erer. Her promise zincirinin bir sonlandırma işleyicisine ihtiyacı vardır.
Bluebird destekler .catch() retler için ve .finally() Her iki durumda da çalışması gereken temizleme işlemleri için. Ayrıca, bir hata türünü ele alırken diğerlerinin yayılmasına izin veren tür belirtilmiş yakalama işlemlerini de destekler.
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(); } });
Burada üç alışkanlık önemlidir. Birincisi, yer .catch() İkinci olarak, her adımdan sonra değil, en sonda kullanın, çünkü bir terminal işleyici zincirdeki her önceki bağlantıdan gelen retleri alır. .finally() Veritabanı bağlantısı gibi kaynakların serbest bırakılması için, hem başarılı hem de başarısız yollarda çalıştığı için uzun yığın etkinleştirilmelidir. Üçüncüsü, hiçbir zaman bir yakalama bloğu olmadan zinciri bırakmayın: ele alınmayan bir reddetme, mevcut sürümlerde Node işlemini sonlandırır ve Bluebird önceden bununla ilgili açık bir uyarı yazdırır. tracgeliştirme sırasında ile Promise.config({ longStackTraces: true }) Bu sayede reddedilmenin kaynağını bulmak çok daha kolaylaşır.
Bluebird Promisify'da Sık Karşılaşılan Hatalar ve Çözümleri
Bluebird'deki sorunların çoğu, kütüphanenin kendisindeki bir hatadan ziyade, promise tabanlı adlandırma kuralından veya aynı zincirde callback ve promise çağırma stillerinin karıştırılmasından kaynaklanır. Aşağıdaki her belirti, nedenini ve çözümünü belirtir.
- “connectAsync bir fonksiyon değildir”: Modül, dolaylı olarak değil, doğrudan gerekliydi.
promisifyAll()Dolayısıyla Async varyantları mevcut değil. `require` çağrısını yukarıda gösterildiği gibi sarmalayın. - Basit metodu çağırdığımda tanımsız (undefined) sonuç alıyorum:
connect()Hala bir geri çağırma bekliyor. Yalnızca Async sonekiyle biten kopyası bir promise döndürür. - Asenkron bir metoda geri çağırma fonksiyonu iletme: ne bir geri arama sağlayın ne de
awaitve vaat fark edilmeden çözülür. Her çağrı için yalnızca bir stil kullanın, ikisini birden değil. - Zaten promise tabanlı bir kütüphanede `promisifyAll` kullanımı: Zararsız ama anlamsız ve kafa karıştırıcı çift ekli isimler oluşturuyor. Öncelikle kütüphane dokümantasyonunu kontrol edin.
- Hataları sessizce kaybetmek: zincirsiz bir
.catch()Node, işlenmemiş bir reddetme durumu bildirene ve çıkana kadar reddetme nedenini gizler. Kısa komut dosyalarında bile, zinciri her zaman bir `catch` bloğuyla sonlandırın.



