Bluebird NPM: Bluebird JS lubadus koos näitega
⚡ Nutikas kokkuvõte
Bluebird JS on täisfunktsionaalne Promise'i teek, mis on mõeldud JavaSkript, mille defineeriv võime on lubaduste esitamine: tagasihelistuspõhiste Node-moodulite teisendamine lubadusi tagastavateks mooduliteks, seega terve teek, näiteks MongoDB Draiverit saab kasutada asünkroonselt.

Mis on Bluebird JS?
Bluebird JS on täisfunktsionaalne Promise'i teek, mis on mõeldud JavaSkript. Selle tugevaim omadus on see, et see võimaldab teil teisi Node'i mooduleid asünkroonselt kasutada. Promisify on tagasihelistusfunktsioonidele rakendatav kontseptsioon ja see tagab, et iga kutsutud tagasihelistusfunktsioon tagastab väärtuse.
Nii et kui a Node.js moodul sisaldab tagasihelistusfunktsiooni, mis ei tagasta väärtust, lubades, et moodul muudab automaatselt kõiki selles olevaid funktsioone nii, et igaüks neist tagastab väärtuse.
See tähendab, et saate Bluebirdi abil teha MongoDB moodul töötab asünkroonselt, mis lisab Node.js rakenduste kirjutamisele veelgi lihtsust.
Allolev näide loob esmalt ühenduse andmebaasi „EmployeeDB“ kollektsiooniga „Employee“. Kui ühendus on loodud, hangib see kõik kollektsiooni kirjed ja kuvab need konsoolis.
Kuidas Bluebird JS raamatukoguga lubadusi luua
Siin on samm-sammult näide, mis näitab, kuidas Bluebird JS teegiga lubadusi genereerida.
1. samm) NPM-moodulite installimine
Bluebirdi kasutamiseks Node'i rakenduses on vajalik Bluebirdi moodul. Paigaldage see järgmise käsuga:
npm install bluebird
2. samm) Lisage Bluebirdi moodul
Järgmine samm on Bluebirdi mooduli lisamine oma koodi ja kogu selle lubamine. MongoDB moodul. Lubadus tähendab siin seda, et Bluebird tagab, et iga moodulis määratletud meetod MongoDB raamatukogu annab lubaduse.
Code Selgitus:
- .
requirekäsk sisaldab Bluebirdi teeki. - Sinilinnu
.promisifyAll()meetod loob iga meetodi asünkroonse versiooni MongoDB moodul pakub, seega igaüks neist töötab taustal ja tagastab lubaduse.
3. samm) Loo ühendus andmebaasiga
Viimane samm on andmebaasiga ühenduse loomine, kõigi kollektsiooni kirjete hankimine ja nende kuvamine konsooli logis.
Code Selgitus:
- Teade
connectAsyncmeetodit kasutatakse tavalise asemelconnectmeetod. Bluebird lisab Asünk iga meetodi järelliide MongoDB teeki, et eristada lubadusi tagastavaid kõnesid lubadusi mittetagastavatest. Asünkroonse järelliiteta meetodid sellist garantiid ei anna. - Sarnaselt
connectAsync,findAsyncmeetod tagastab kõik kirjed MongoDB „Töötaja” kollektsioon. - If
findAsyncKui probleem lahendatakse edukalt, itereerib järgmine plokk läbi iga kollektsiooni kirje ja kuvab selle konsooli logis.
Kui ülaltoodud toimingud on õigesti tehtud, kuvatakse konsoolis kõik töötaja kollektsiooni dokumendid, nagu on näidatud allolevas väljundis.
Siin on täielik kood viitamiseks:
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); }); });
⚠️ Draiveri versiooni märkus: ülaltoodud kood sihtib MongoDB Sõlme draiver 2.x, kus connect lahendab andmebaasiobjekti abil. Draiverilt 3.0 edasi see laheneb a-ga MongoClient, seega peab kett helistama client.db('EmployeeDB').collection('Employee') asemel db.collection('Employee')Kaasaegsed draiveriversioonid tagastavad juba natiivseid lubadusi, mis teeb promisifyAll tarbetu MongoDB konkreetselt.
Bluebird vs Native Promises: millist kasutada
Kui Bluebird esmakordselt kirjutati, polnud Node'il üldse lubaduste tuge, seega täitis see teek platvormil oleva tühimiku. Node on pakkunud natiivseid lubadusi alates versioonist 4 ja async/await alates versioonist 7.6, mis muudab arvutamist märkimisväärselt igaühe jaoks, kes täna projekti alustab.
| Aspekt | Bluebird | Natiivsed lubadused |
|---|---|---|
| Sõltuvus | Npm-pakett installimiseks ja haldamiseks | Käituskeskkonda sisse ehitatud |
| Paljulubavad tagasihelistamised | promisifyAll() teisendab terve mooduli |
util.promisify() teisendab ühe funktsiooni |
| Lisaabilised | kaart, filter, rekvisiidid, igaüks, ajalõpp, tühistamine | kõik, kõikKindlustatud, ükskõik milline, ainult rass |
| Pikk virn traces | Jah, kui lubatud | Täiustatud, aga lühem |
| Parim on | Pärandi tagasihelistusteegid, samaaegsuse abilised | Uus kood ja kõik, mis kasutab asünkroonset, ootavad |
Uue töö jaoks vali natiivsed lubadused, kuna need ei vaja sõltuvust ja integreeruvad otse async await'iga. Kasuta Bluebirdi, kui sõltuvus pakub endiselt ainult tagasihelistusi või kui selle samaaegsuse abifunktsioonid, näiteks Promise.map samaaegsuse piiranguga säästa märkimisväärsel hulgal koodi.
Kuidas Bluebird Promises'i vigadega toime tulla
Ülaltoodud näitel puudub tõrketee. Kui MongoDB ei tööta või kollektsiooni nimi on vale, siis ahel lükkab protsessi tagasi ja midagi ei kuvata – protsess lihtsalt väljub ilma igasuguse selgituseta. Igal lubadusahelal on vaja terminali käitlejat.
Bluebirdi toed .catch() tagasilükkamiste ja .finally() puhastamiseks, mis peab töötama mõlemal viisil. See toetab ka tüüpkinnitusi, mis käsitlevad ühte veaklassi, jättes samal ajal teised levima.
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(); } });
Siin on olulised kolm harjumust. Esiteks, koht .catch() lõpus, mitte iga sammu järel, sest üks terminali käitleja saab tagasilükkamisi igalt eelnevalt ahela lülilt. Teiseks, kasutage .finally() ressursside (nt andmebaasiühenduse) vabastamiseks, kuna see töötab nii õnnestumise kui ka ebaõnnestumise teel. Kolmandaks, ärge kunagi jätke ahelat ilma püügivahendita: käsitlemata tagasilükkamine lõpetab Node'i protsessi praegustes versioonides ja Bluebird kuvab selle kohta enne selgesõnalise hoiatuse. Pika pinu lubamine tracarenduse ajal koos Promise.config({ longStackTraces: true }) muudab tagasilükkamise algpõhjuse leidmise palju lihtsamaks.
Levinud Bluebird Promisify vead ja parandused
Enamik Bluebirdi probleeme tuleneb pigem lubatud nimetamiskonventsioonist või tagasihelistus- ja lubaduskõnede stiilide segamisest samas ahelas, mitte teegi enda veast. Iga allpool toodud sümptom nimetab selle põhjuse ja lahenduse.
- „connectAsync ei ole funktsioon”: moodulit oli vaja otse, mitte läbi
promisifyAll(), seega asünkroonseid variante pole olemas. Murra require'i kutse ülaltoodud viisil. - Lihtmeetodi kutsumine ja määratlemata saamine:
connect()ootab ikka tagasihelistamist. Ainult asünkroonse sufiksiga koopia tagastab lubaduse. - Tagasihelistamise edastamine asünkroonsele meetodile: ei paku tagasihelistamist ega
awaitja lubadus laheneb tähelepanuta jäetuna. Kasutage iga kutse kohta ühte stiili, mitte mõlemat. - promisifyAll juba lubaduspõhisel teegil: kahjutu, aga mõttetu ning tekitab segadust tekitavaid topeltlõigliidega nimesid. Kontrolli kõigepealt raamatukogu dokumentatsiooni.
- Vigade vaikne kaotamine: kett ilma
.catch()Peidab tagasilükkamise põhjuse, kuni sõlm teatab käsitlemata tagasilükkamisest ja väljub. Lõpetage ahel alati catch-käsuga, isegi lühikeste skriptide puhul.



