Bluebird NPM: Bluebird JS obećanje s primjerom
⚡ Pametni sažetak
Bluebird JS je potpuno opremljena Promise biblioteka za JavaSkripta čija je definirajuća sposobnost obećanje: pretvaranje Node modula temeljenih na povratnim pozivima u one koji vraćaju obećanja, tako da cijela biblioteka poput MongoDB Upravljački program se može koristiti asinkrono.

Što je Bluebird JS?
Bluebird JS je potpuno opremljena Promise biblioteka za JavaSkripta. Njegova najjača značajka je što vam omogućuje "obećavanje" drugih Node modula kako biste ih mogli koristiti asinkrono. Promisify je koncept koji se primjenjuje na callback funkcije i osigurava da svaka callback funkcija koja se pozove vrati vrijednost.
Pa ako a Node.js Modul sadrži funkciju povratnog poziva koja ne vraća vrijednost, što obećava da će modul automatski modificirati sve funkcije u njemu tako da svaka vraća vrijednost.
To znači da možete koristiti Bluebird za izradu MongoDB modul se izvršava asinkrono, što dodaje još jednu razinu jednostavnosti pri pisanju Node.js aplikacija.
Primjer u nastavku prvo uspostavlja vezu s kolekcijom „Employee“ u bazi podataka „EmployeeDB“. Nakon što se veza uspostavi, dohvaća sve zapise u kolekciji i prikazuje ih u konzoli.
Kako generirati obećanja pomoću Bluebird JS biblioteke
Evo korak-po-korak primjera koji pokazuje kako generirati obećanja pomoću Bluebird JS biblioteke.
Korak 1) Instaliranje NPM modula
Za korištenje Bluebirda unutar Node aplikacije potreban je Bluebird modul. Instalirajte ga pomoću naredbe u nastavku:
npm install bluebird
Korak 2) Uključite Bluebird modul
Sljedeći korak je uključivanje Bluebird modula u vaš kod i obećanje cijelog MongoDB modul. Obećavanje ovdje znači da Bluebird osigurava da svaka metoda definirana u MongoDB knjižnica vraća obećanje.
Code Objašnjenje:
- The
requireNaredba uključuje biblioteku Bluebird. - Plava ptica
.promisifyAll()metoda stvara asinkronu verziju svake metode MongoDB modul pruža, tako da svaki od njih radi u pozadini i vraća obećanje.
Korak 3) Povežite se s bazom podataka
Posljednji korak je povezivanje s bazom podataka, dohvaćanje svih zapisa u kolekciji i njihov prikaz u zapisniku konzole.
Code Objašnjenje:
- Obavijest
connectAsyncmetoda se koristi umjesto uobičajeneconnectmetoda. Bluebird dodaje Asinkroniziraj sufiks svakoj metodi u MongoDB biblioteku za razlikovanje poziva koji vraćaju obećanja od onih koji ne. Metode bez sufiksa Async ne nose takvo jamstvo. - Slično
connectAsyncjefindAsyncMetoda vraća sve zapise u MongoDB Kolekcija „Zaposlenik“. - If
findAsyncuspješno se riješi, sljedeći blok iterira kroz svaki zapis u kolekciji i prikazuje ga u zapisniku konzole.
Ako su gore navedeni koraci ispravno izvedeni, svi dokumenti u kolekciji Employee prikazuju se u konzoli, kao što je prikazano u donjem izlazu.
Evo kompletnog koda za referencu:
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); }); });
⚠️ Napomena o verziji upravljačkog programa: gornji kod cilja MongoDB Upravljački program čvora 2.x, gdje connect rješava se s objektom baze podataka. Iz upravljačkog programa 3.0 nadalje rješava se s MongoClient, pa lanac mora pozvati client.db('EmployeeDB').collection('Employee') umjesto db.collection('Employee')Moderne verzije upravljačkih programa također već vraćaju izvorna obećanja, što čini promisifyAll nepotrebno za MongoDB posebno.
Bluebird vs. Native Promises: Koje koristiti
Kada je Bluebird prvi put napisan, Node uopće nije imao podršku za obećanja, pa je biblioteka popunila pravu prazninu u platformi. Node je isporučivao izvorna obećanja od verzije 4 i async/await od verzije 7.6, što znatno mijenja izračun za svakoga tko danas započinje projekt.
| Aspekt | plava ptica | Domaća obećanja |
|---|---|---|
| zavisnost | npm paket za instalaciju i održavanje | Ugrađeno u runtime |
| Obećavajući povratni pozivi | promisifyAll() pretvara cijeli modul |
util.promisify() pretvara jednu funkciju |
| Dodatni pomagači | mapa, filter, rekviziti, svaki, vremensko ograničenje, otkazivanje | svi, sviNaseljenici, bilo koji, samo rasa |
| Dugi stog traces | Da, kada je omogućeno | Poboljšano, ali kraće |
| Najbolje za | Naslijeđene biblioteke povratnih poziva, pomoćnici za konkurentnost | Novi kod i sve što koristi asinkronost čekaju |
Odaberite izvorna obećanja za novi rad, budući da im nije potrebna ovisnost i izravno se integriraju s async await. Posegnite za Bluebirdom kada ovisnost i dalje izlaže samo povratne pozive ili kada njegovi pomagači za konkurentnost, kao što su Promise.map s ograničenjem konkurentnosti, uštedite značajnu količinu koda.
Kako riješiti greške s Bluebird Promisesima
Gornji primjer nema putanju kvara. Ako MongoDB ne radi ili je naziv kolekcije pogrešan, lanac odbija i ništa se ne ispisuje — proces se jednostavno završava bez objašnjenja. Svaki lanac obećanja treba terminalni rukovatelj.
Bluebird podržava .catch() za odbijanja i .finally() za čišćenje koje se mora izvršavati u oba smjera. Također podržava tipizirane hvatače, koji obrađuju jednu klasu pogrešaka dok dopuštaju širenje drugih.
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(); } });
Ovdje su važne tri navike. Prvo, mjesto .catch() na kraju, a ne nakon svakog koraka, jer jedan terminalni rukovatelj prima odbijanja od svake prethodne karike u lancu. Drugo, koristite .finally() za oslobađanje resursa poput veze s bazom podataka, budući da se izvodi i na putu uspjeha i na putu neuspjeha. Treće, nikada ne ostavljajte lanac bez kvake: neobrađeno odbacivanje prekida proces Node na trenutnim verzijama, a Bluebird će prethodno ispisati eksplicitno upozorenje o tome. Omogućavanje dugog stacka tractijekom razvoja s Promise.config({ longStackTraces: true }) znatno olakšava lociranje izvora odbijanja.
Uobičajene greške i ispravci u Bluebird Promisifyju
Većina problema s Bluebirdom proizlazi iz konvencije imenovanja obećanja ili iz miješanja stilova pozivanja povratnog poziva i obećanja u istom lancu, a ne iz bilo kakve greške u samoj biblioteci. Svaki simptom u nastavku navodi svoj uzrok i rješenje.
- „connectAsync nije funkcija“: modul je bio potreban izravno umjesto putem
promisifyAll(), tako da ne postoje asinkrone varijante. Zamotajte require poziv kao što je gore prikazano. - Pozivanje obične metode i dobivanje nedefinirane vrijednosti:
connect()i dalje očekuje povratni poziv. Samo kopija s asinkronim sufiksom vraća obećanje. - Prosljeđivanje povratnog poziva asinkronoj metodi: ne pružaju ni povratni poziv ni
awaiti obećanje se rješava neopaženo. Koristite jedan stil po pozivu, ne oba. - promisifyAll na biblioteci koja je već bazirana na obećanjima: bezopasno, ali besmisleno, i stvara zbunjujuća imena s dvostrukim sufiksima. Prvo provjerite dokumentaciju knjižnice.
- Tiho gubljenje grešaka: lanac bez
.catch()skriva razlog odbijanja dok Node ne prijavi neobrađeno odbijanje i ne izađe. Uvijek prekini lanac s naredbom catch, čak i u kratkim skriptama.



