Bluebird NPM: Bluebird JS Promise med eksempel
โก Smart opsummering
Bluebird JS er et fuldt udstyret Promise-bibliotek til JavaScript hvis definerende evne er promisification: konvertering af callback-baserede nodemoduler til promise-returnerende moduler, sรฅ et helt bibliotek som f.eks. MongoDB Driveren kan bruges asynkront.

Hvad er Bluebird JS?
Bluebird JS er et fuldt udstyret Promise-bibliotek til JavaScript. Dens stรฆrkeste funktion er, at den giver dig mulighed for at "promisify" andre Node-moduler for at bruge dem asynkront. Promisify er et koncept, der anvendes pรฅ callback-funktioner, og det sikrer, at hver callback-funktion, der kaldes, returnerer en vรฆrdi.
Sรฅ hvis en node.js Modulet indeholder en callback-funktion, der ikke returnerer en vรฆrdi, og lover, at modulet automatisk รฆndrer alle funktionerne i det, sรฅ hver enkelt returnerer en vรฆrdi.
Det betyder, at du kan bruge Bluebird til at lave MongoDB modulet kรธrer asynkront, hvilket gรธr det endnu nemmere at skrive Node.js-applikationer.
Eksemplet nedenfor opretter fรธrst en forbindelse til samlingen "Employee" i databasen "EmployeeDB". Nรฅr forbindelsen er etableret, hentes alle poster i samlingen og vises i konsollen.
Sรฅdan genererer du lรธfter med Bluebird JS Library
Her er et trin-for-trin eksempel, der viser, hvordan man genererer promises med Bluebird JS-biblioteket.
Trin 1) Installation af NPM-modulerne
For at bruge Bluebird fra en Node-applikation krรฆves Bluebird-modulet. Installer det med kommandoen nedenfor:
npm install bluebird
Trin 2) Inkluder Bluebird-modulet
Det nรฆste trin er at inkludere Bluebird-modulet i din kode og love hele MongoDB modul. At love her betyder, at Bluebird sikrer, at alle metoder defineret i MongoDB biblioteket giver et lรธfte.
Code Forklaring:
-
requireKommandoen inkluderer Bluebird-biblioteket. - Bluebird's
.promisifyAll()Metoden opretter en asynkron version af hver metode MongoDB modulet leverer, sรฅ hver enkelt kรธrer i baggrunden og returnerer et lรธfte.
Trin 3) Opret forbindelse til databasen
Det sidste trin er at oprette forbindelse til databasen, hente alle poster i samlingen og vise dem i konsolloggen.
Code Forklaring:
- Lรฆg mรฆrke til
connectAsyncmetoden anvendes i stedet for den normaleconnectmetode. Bluebird tilfรธjer asynkron suffiks til hver metode i MongoDB biblioteket til at skelne mellem de kald, der returnerer lรธfter, og dem, der ikke gรธr. Metoder uden suffikset Async har ingen sรฅdan garanti. - Svarende til
connectAsync,findAsyncMetoden returnerer alle poster i MongoDB "Medarbejder"-kollektionen. - If
findAsyncHvis det lรธses korrekt, iterererer den fรธlgende blok gennem hver post i samlingen og viser den i konsolloggen.
Hvis ovenstรฅende trin udfรธres korrekt, vises alle dokumenterne i medarbejdersamlingen i konsollen, som vist i outputtet nedenfor.
Her er den komplette kode til reference:
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); }); });
โ ๏ธ Bemรฆrkning om driverversion: koden ovenfor mรฅl MongoDB Nodedriver 2.x, hvor connect lรธser med et databaseobjekt. Fra driver 3.0 og fremefter det lรธser sig med en MongoClient, sรฅ kรฆden skal ringe client.db('EmployeeDB').collection('Employee') i stedet for db.collection('Employee')Moderne driverversioner returnerer ogsรฅ allerede native lรธfter, hvilket gรธr promisifyAll unรธdvendig for MongoDB specifikt.
Bluebird vs. Native Promises: Hvilke skal man bruge
Da Bluebird fรธrst blev skrevet, havde Node slet ingen understรธttelse af promises, sรฅ biblioteket udfyldte et reelt hul i platformen. Node har leveret native promises siden version 4 og async/await siden version 7.6, hvilket รฆndrer beregningen betydeligt for alle, der starter et projekt i dag.
| Aspect | Bluebird | Indfรธdte lรธfter |
|---|---|---|
| Afhรฆngighed | En npm-pakke til installation og vedligeholdelse | Indbygget i runtime-funktionen |
| Lรธfter tilbagekald | promisifyAll() konverterer et helt modul |
util.promisify() konverterer รฉn funktion |
| Ekstra hjรฆlpere | kort, filter, rekvisitter, hver, timeout, annullering | alle, alleAfgjort, enhver, kun race |
| Lang stak traces | Ja, nรฅr aktiveret | Forbedret men kortere |
| Bedste for | รldre callback-biblioteker, samtidighedshjรฆlpere | Ny kode, og alt, der bruger async, venter |
Vรฆlg native promises til nyt arbejde, da de ikke krรฆver nogen afhรฆngighed og integrerer direkte med async await. Brug Bluebird, nรฅr en afhรฆngighed stadig kun eksponerer callbacks, eller nรฅr dens samtidighedshjรฆlpere, f.eks. Promise.map med en samtidighedsgrรฆnse, spar en betydelig mรฆngde kode.
Sรฅdan hรฅndterer du fejl med Bluebird Promises
Eksemplet ovenfor har ingen fejlsti. Hvis MongoDB kรธrer ikke, eller samlingsnavnet er forkert, afviser kรฆden, og der udskrives intet โ processen afsluttes simpelthen uden forklaring. Enhver lรธftekรฆde har brug for en terminalhandler.
Bluebird-stรธtter .catch() for afslag og .finally() til oprydning, der skal kรธre pรฅ begge mรฅder. Den understรธtter ogsรฅ typede fangster, som hรฅndterer รฉn fejlklasse, mens andre lader sprede sig.
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(); } });
Tre vaner er vigtige her. For det fรธrste, sted .catch() i slutningen snarere end efter hvert trin, fordi รฉn terminalhandler modtager afvisninger fra alle foregรฅende led i kรฆden. For det andet, brug .finally() til frigivelse af ressourcer sรฅsom en databaseforbindelse, da den kรธrer pรฅ bรฅde succes- og fiaskostierne. For det tredje, lad aldrig en kรฆde vรฆre uden en fangst: en ubehandlet afvisning afslutter Node-processen pรฅ aktuelle versioner, og Bluebird vil udskrive en eksplicit advarsel om det pรฅ forhรฅnd. Aktivering af long stack traces under udvikling med Promise.config({ longStackTraces: true }) gรธr det langt nemmere at finde oprindelsen af โโen afvisning.
Almindelige Bluebird Promisify-fejl og rettelser
De fleste Bluebird-problemer stammer fra den promisified-navngivningskonvention eller fra en blanding af callback- og promise-kaldsstile i samme kรฆde, snarere end fra en fejl i selve biblioteket. Hvert symptom nedenfor angiver sin รฅrsag og sin lรธsning.
- "connectAsync er ikke en funktion": modulet var pรฅkrรฆvet direkte i stedet for via
promisifyAll(), sรฅ der findes ingen async-varianter. Ombryd require-kaldet som vist ovenfor. - Kalder plain-metoden og fรฅr udefineret:
connect()forventer stadig et callback. Kun kopien med Async-suffikset returnerer et lรธfte. - Videregivelse af et callback til en async-metode: hverken give et tilbagekald eller
awaitog lรธftet oplรธses ubemรฆrket. Brug รฉn stil pr. kald, ikke begge. - promisifyAll pรฅ et allerede lรธftebaseret bibliotek: harmlรธst, men meningslรธst, og det producerer forvirrende navne med dobbelte suffikser. Tjek fรธrst bibliotekets dokumentation.
- Mister fejl lydlรธst: en kรฆde uden
.catch()skjuler รฅrsagen til afvisningen, indtil Node rapporterer en ubehandlet afvisning og afslutter. Afslut altid kรฆden med en catch, selv i korte scripts.



