Bluebird NPM: Bluebird JS Promise cu exemplu
⚡ Rezumat inteligent
Bluebird JS este o bibliotecă Promise completă pentru JavaScript a cărui capacitate definitorie este promisificarea: convertirea modulelor Node bazate pe callback în module care returnează promisiuni, astfel încât o întreagă bibliotecă, cum ar fi MongoDB Driverul poate fi utilizat asincron.
Ce este Bluebird JS?
Bluebird JS este o bibliotecă Promise completă pentru JavaScript. Cea mai puternică caracteristică a sa este că vă permite să „promiteți” alte module Node pentru a le utiliza asincron. Promisiunea este un concept aplicat funcțiilor de apel invers și asigură că fiecare funcție de apel invers apelată returnează o valoare.
Deci dacă a Node.js Modulul conține o funcție de callback care nu returnează o valoare, promițând că modulul modifică automat toate funcțiile din el astfel încât fiecare dintre ele returnează o valoare.
Asta înseamnă că poți folosi Bluebird pentru a face MongoDB modulul rulează asincron, ceea ce adaugă un alt nivel de ușurință la scrierea aplicațiilor Node.js.
Exemplul de mai jos stabilește mai întâi o conexiune la colecția „Employee” din baza de date „EmployeeDB”. Odată ce conexiunea este stabilită, acesta preia toate înregistrările din colecție și le afișează în consolă.
Cum să generați promisiuni cu Bluebird JS Library
Iată un exemplu pas cu pas care arată cum se generează promisiuni cu biblioteca Bluebird JS.
Pasul 1) Instalarea modulelor NPM
Pentru a utiliza Bluebird dintr-o aplicație Node, este necesar modulul Bluebird. Instalați-l cu comanda de mai jos:
npm install bluebird
Pasul 2) Includeți modulul Bluebird
Următorul pas este să includeți modulul Bluebird în codul dvs. și să promiteți întregul MongoDB modul. Promițând aici înseamnă că Bluebird se asigură că fiecare metodă definită în MongoDB biblioteca returnează o promisiune.
Code Explicaţie:
-
requireComanda include biblioteca Bluebird. - Bluebird's
.promisifyAll()Metoda creează o versiune asincronă a fiecărei metode MongoDB oferă modulul, astfel încât fiecare rulează în fundal și returnează o promisiune.
Pasul 3) Conectarea la baza de date
Pasul final este conectarea la baza de date, recuperarea tuturor înregistrărilor din colecție și afișarea lor în jurnalul consolei.
Code Explicaţie:
- Observați
connectAsyncse folosește o metodă în locul celei obișnuiteconnectmetodă. Bluebird adaugă async sufix pentru fiecare metodă din MongoDB bibliotecă pentru a distinge apelurile care returnează promisiuni de cele care nu o fac. Metodele fără sufixul Async nu oferă o astfel de garanție. - similar
connectAsync,findAsyncMetoda returnează toate înregistrările din MongoDB Colecția „Angajat”. - If
findAsyncDacă problema se rezolvă cu succes, următorul bloc iterează prin fiecare înregistrare din colecție și o afișează în jurnalul consolei.
Dacă pașii de mai sus sunt parcurși corect, toate documentele din colecția Angajați sunt afișate în consolă, așa cum se arată în rezultatul de mai jos.
Iată codul complet pentru referință:
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); }); });
⚠️ Notă privind versiunea driverului: Codul de mai sus vizează MongoDB Driver de nod 2.x, unde connect se rezolvă cu un obiect al bazei de date. Din driver 3.0 înainte se rezolvă cu o MongoClient, deci lanțul trebuie să apeleze client.db('EmployeeDB').collection('Employee') în loc de db.collection('Employee')Versiunile moderne de drivere returnează deja promisiuni native, ceea ce face ca promisifyAll inutil pentru MongoDB specific.
Bluebird vs. Native Promises: Pe care să le folosiți
Când Bluebird a fost scris pentru prima dată, Node nu avea niciun suport pentru promisiuni, așa că biblioteca a umplut un gol real în platformă. Node a livrat promisiuni native încă de la versiunea 4 și async/await de la versiunea 7.6, ceea ce schimbă considerabil calculul pentru oricine începe un proiect astăzi.
| Aspect | Bluebird | Promisiuni native |
|---|---|---|
| Dependenţă | Un pachet npm pentru instalare și întreținere | Integrat în runtime |
| Reapelări promițătoare | promisifyAll() convertește un modul întreg |
util.promisify() convertește o funcție |
| Ajutoare suplimentare | hartă, filtru, recuzită, fiecare, expirare, anulare | toți, toți stabiliți, orice, doar rasă |
| Stivă lungă traces | Da, când este activat | Îmbunătățit, dar mai scurt |
| Cel mai bun pentru | Biblioteci de apel invers vechi, instrumente de asistență pentru concurență | Cod nou și orice folosește async await |
Alegeți promisiuni native pentru lucrări noi, deoarece nu necesită dependențe și se integrează direct cu async await. Apelați la Bluebird atunci când o dependență expune doar apeluri inverse sau când funcțiile sale de asistență concurențială, cum ar fi Promise.map cu o limită de concurență, economisiți o cantitate semnificativă de cod.
Cum să gestionezi erorile cu promisiunile Bluebird
Exemplul de mai sus nu are o cale de eroare. Dacă MongoDB nu rulează sau numele colecției este greșit, lanțul respinge procesul și nu se afișează nimic — procesul pur și simplu se încheie fără nicio explicație. Fiecare lanț de promisiuni are nevoie de un handler de terminal.
Suporturi Bluebird .catch() pentru respingeri și .finally() pentru curățare care trebuie să ruleze în ambele sensuri. De asemenea, acceptă erori prinse cu tip, care gestionează o clasă de erori în timp ce le permit altora să se propage.
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(); } });
Trei obiceiuri contează aici. În primul rând, locul .catch() la sfârșit, mai degrabă decât după fiecare pas, deoarece un handler de terminal primește respingeri de la fiecare verigă precedentă din lanț. În al doilea rând, utilizați .finally() pentru eliberarea de resurse precum o conexiune la baza de date, deoarece rulează atât pe calea de succes, cât și pe cea de eșec. În al treilea rând, nu lăsați niciodată un lanț fără o captură: o respingere netratată termină procesul Node pe versiunile curente, iar Bluebird va afișa în prealabil un avertisment explicit despre aceasta. Activarea long stack-ului tracîn timpul dezvoltării cu Promise.config({ longStackTraces: true }) face ca originea unei respingeri să fie mult mai ușor de localizat.
Erori și remedieri comune ale Bluebird Promisify
Majoritatea problemelor Bluebird provin din convenția de denumire promisă sau din combinarea stilurilor de apelare callback și promise în același lanț, mai degrabă decât din vreo eroare a bibliotecii în sine. Fiecare simptom de mai jos își numește cauza și remedierea.
- „connectAsync nu este o funcție”: modulul a fost solicitat direct în loc de prin intermediul
promisifyAll(), deci nu există variante asincrone. Încadrați apelul require așa cum se arată mai sus. - Apelarea metodei simple și obținerea valorii nedefinite:
connect()încă așteaptă o funcție de apel invers. Doar copia cu sufix Async returnează o promisiune. - Transmiterea unui apel invers către o metodă Async: nu oferă nici un apel invers, nici
awaitși promisiunea se rezolvă neobservată. Folosește un singur stil per apel, nu ambele. - promisifyAll pe o bibliotecă deja bazată pe promisiuni: inofensiv, dar fără rost și produce nume confuze cu sufixe duble. Verificați mai întâi documentația bibliotecii.
- Pierderea erorilor în tăcere: un lanț fără
.catch()ascunde motivul respingerii până când Node raportează o respingere negestionată și se închide. Întotdeauna termină lanțul cu o comandă catch, chiar și în scripturi scurte.




