Bluebird NPM: Bluebird JS Promise s příkladem
⚡ Chytré shrnutí
Bluebird JS je plně vybavená Promise knihovna pro JavaSkript, jehož definující schopností je promisifikace: převod modulů Node založených na zpětném volání na moduly vracející promisy, takže celá knihovna, jako například MongoDB Ovladač lze použít asynchronně.

Co je Bluebird JS?
Bluebird JS je plně vybavená Promise knihovna pro JavaSkript. Jeho nejsilnější vlastností je, že umožňuje „promisifikovat“ další moduly Node, abyste je mohli používat asynchronně. Promisify je koncept aplikovaný na callback funkce a zajišťuje, že každá volána callback funkce vrátí hodnotu.
Takže pokud Node.js Modul obsahuje callback funkci, která nevrací hodnotu, což slibuje, že modul automaticky upraví všechny funkce v něm tak, aby každá z nich vracela hodnotu.
To znamená, že k vytvoření můžete použít Bluebird MongoDB modul běží asynchronně, což přidává další úroveň snadnosti při psaní Node.js aplikací.
Následující příklad nejprve naváže připojení ke kolekci „Employee“ v databázi „EmployeeDB“. Jakmile je připojení navázáno, načte všechny záznamy v kolekci a zobrazí je v konzoli.
Jak generovat sliby s Bluebird JS Library
Zde je podrobný příklad ukazující, jak generovat promisy pomocí knihovny Bluebird JS.
Krok 1) Instalace modulů NPM
Pro použití Bluebirdu z aplikace Node je vyžadován modul Bluebird. Nainstalujte ho pomocí níže uvedeného příkazu:
npm install bluebird
Krok 2) Přidejte modul Bluebird
Dalším krokem je zahrnutí modulu Bluebird do vašeho kódu a jeho promisifikace. MongoDB modul. Slibování zde znamená, že Bluebird zajistí, že každá metoda definovaná v MongoDB knihovna vrací slib.
Code Vysvětlení:
- Jedno
requirePříkaz obsahuje knihovnu Bluebird. - Bluebird's
.promisifyAll()Metoda vytváří asynchronní verzi každé metody, kterou MongoDB modul poskytuje, takže každý z nich běží na pozadí a vrací promise.
Krok 3) Připojení k databázi
Posledním krokem je připojení k databázi, načtení všech záznamů v kolekci a jejich zobrazení v protokolu konzole.
Code Vysvětlení:
- Všimněte si, že
connectAsyncmetoda se používá místo běžnéconnectmetoda. Bluebird připojuje Async přípona ke každé metodě v MongoDB knihovna pro rozlišení volání, která vracejí promise, od těch, která je nevrací. Metody bez přípony Async nemají žádnou takovou záruku. - Podobně jako u
connectAsyncsefindAsyncMetoda vrací všechny záznamy v MongoDB Kolekce „Zaměstnanec“. - If
findAsyncPokud se problém úspěšně vyřeší, následující blok projde každým záznamem v kolekci a zobrazí ho v protokolu konzole.
Pokud jsou výše uvedené kroky provedeny správně, všechny dokumenty v kolekci Employee se zobrazí v konzoli, jak je znázorněno na níže uvedeném výstupu.
Zde je kompletní kód pro referenci:
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); }); });
⚠️ Poznámka k verzi ovladače: výše uvedený kód cílí MongoDB Ovladač uzlu 2.x, kde connect řeší se pomocí databázového objektu. Z ovladače 3.0 dále vyřeší se to s MongoClient, takže řetězec musí volat client.db('EmployeeDB').collection('Employee') místo db.collection('Employee')Moderní verze ovladačů také již vracejí nativní promisy, což dělá promisifyAll zbytečné pro MongoDB specificky.
Bluebird vs. Native Promise: Který použít
Když byl Bluebird poprvé napsán, Node neměl žádnou podporu promise, takže knihovna zaplnila skutečnou mezeru v platformě. Node nabízí nativní promise od verze 4 a... async/await od verze 7.6, což značně mění výpočet pro každého, kdo dnes začíná s projektem.
| Vzhled | Bluebird | Domorodé sliby |
|---|---|---|
| Závislost | Balíček npm pro instalaci a údržbu | Vestavěné do běhového prostředí |
| Slibné zpětné volání | promisifyAll() převede celý modul |
util.promisify() převádí jednu funkci |
| Další pomocníci | mapa, filtr, props, každý, časový limit, zrušení | všichni, všichniUsazení, jakýkoli, pouze rasa |
| Dlouhý stack traces | Ano, pokud je povoleno | Vylepšené, ale kratší |
| Nejlepší pro | Starší knihovny zpětných volání, pomocníci pro souběžnost | Nový kód a cokoli, co používá async, await |
Pro novou práci zvolte nativní promisy, protože nepotřebují žádnou závislost a integrují se přímo s async await. Po Bluebirdu se obraťte, když závislost stále zpřístupňuje pouze zpětná volání nebo když její pomocné funkce pro souběžnost, jako například Promise.map s limitem souběžnosti ušetřete smysluplné množství kódu.
Jak ošetřit chyby pomocí promisů Bluebird
Výše uvedený příklad nemá žádnou cestu k selhání. Pokud MongoDB neběží nebo je název kolekce nesprávný, řetězec odmítne a nic se nevypíše – proces se jednoduše ukončí bez vysvětlení. Každý řetězec promise potřebuje terminálový obslužný program.
Bluebird podporuje .catch() pro odmítnutí a .finally() pro čištění, které musí probíhat v obou směrech. Podporuje také typované zachycení, které zpracovává jednu třídu chyb, zatímco umožňuje šíření ostatních.
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(); } });
Důležité jsou zde tři návyky. Zaprvé, místo .catch() na konci, nikoli po každém kroku, protože jeden terminálový obslužný program přijímá odmítnutí od každého předchozího článku v řetězci. Za druhé, použijte .finally() pro uvolnění zdrojů, jako je například databázové připojení, protože běží na cestách úspěchu i neúspěchu. Za třetí, nikdy nenechávejte řetězec bez zachycení: neošetřené odmítnutí ukončí proces Node v aktuálních verzích a Bluebird o tom předem vypíše explicitní varování. Povolení dlouhého zásobníku tracběhem vývoje s Promise.config({ longStackTraces: true }) mnohem snadněji lokalizuje původ odmítnutí.
Běžné chyby a opravy v programu Bluebird Promisify
Většina problémů s Bluebirdem pochází z konvence pojmenování promisifikací nebo z kombinace stylů volání callback a promise ve stejném řetězci, spíše než z chyby v samotné knihovně. Každý níže uvedený příznak pojmenovává svou příčinu a řešení.
- „connectAsync není funkce“: modul byl vyžadován přímo, nikoli prostřednictvím
promisifyAll(), takže neexistují žádné asynchronní varianty. Zabalte volání require, jak je znázorněno výše. - Volání metody plain a získání nedefinované hodnoty:
connect()stále očekává zpětné volání. Pouze kopie s asynchronní příponou vrací promise. - Předání zpětného volání asynchronní metodě: neposkytují ani zpětné volání, ani
awaita slib se vyřeší nepozorovaně. Použijte jeden styl na volání, ne oba. - promisifyAll na knihovně již založené na promisech: neškodné, ale bezúčelné a vytváří matoucí názvy s dvojitou příponou. Nejprve si projděte dokumentaci ke knihovně.
- Tichá ztráta chyb: řetěz bez
.catch()skryje důvod odmítnutí, dokud Node nenahlásí neošetřené odmítnutí a neukončí se. Řetězec vždy ukončete příkazem catch, a to i v krátkých skriptech.



