Bluebird NPM: Bluebird JS Promise med exempel
โก Smart sammanfattning
Bluebird JS รคr ett fullfjรคdrat Promise-bibliotek fรถr JavaSkript vars definierande fรถrmรฅga รคr promisifiering: konvertera callback-baserade Node-moduler till promise-returnerande moduler, sรฅ ett helt bibliotek som MongoDB Drivrutinen kan anvรคndas asynkront.

Vad รคr Bluebird JS?
Bluebird JS รคr ett fullfjรคdrat Promise-bibliotek fรถr JavaSkript. Dess starkaste funktion รคr att den lรฅter dig "promisify" andra Node-moduler fรถr att kunna anvรคnda dem asynkront. Promisify รคr ett koncept som tillรคmpas pรฅ callback-funktioner, och det sรคkerstรคller att varje callback-funktion som anropas returnerar ett vรคrde.
Sรฅ om en node.js Modulen innehรฅller en callback-funktion som inte returnerar ett vรคrde, vilket lovar att modulen automatiskt modifierar alla funktioner i den sรฅ att var och en returnerar ett vรคrde.
Det hรคr betyder att du kan anvรคnda Bluebird fรถr att gรถra MongoDB modulen kรถrs asynkront, vilket gรถr det รคnnu enklare att skriva Node.js-applikationer.
Exemplet nedan upprรคttar fรถrst en anslutning till samlingen โEmployeeโ i databasen โEmployeeDBโ. Nรคr anslutningen รคr upprรคttad hรคmtas alla poster i samlingen och visas i konsolen.
Hur man skapar lรถften med Bluebird JS Library
Hรคr รคr ett steg-fรถr-steg-exempel som visar hur man genererar lรถften med Bluebird JS-biblioteket.
Steg 1) Installera NPM-modulerna
Fรถr att anvรคnda Bluebird inifrรฅn en Node-applikation krรคvs Bluebird-modulen. Installera den med kommandot nedan:
npm install bluebird
Steg 2) Inkludera Bluebird-modulen
Nรคsta steg รคr att inkludera Bluebird-modulen i din kod och lova hela MongoDB modulen. Att lova hรคr innebรคr att Bluebird sรคkerstรคller att varje metod som definieras i MongoDB biblioteket ger ett lรถfte.
Code Fรถrklaring:
- Ocuco-landskapet
requirekommandot inkluderar Bluebird-biblioteket. - Bluebird's
.promisifyAll()Metoden skapar en asynkron version av varje metod MongoDB modulen tillhandahรฅller, sรฅ var och en kรถrs i bakgrunden och returnerar ett lรถfte.
Steg 3) Anslut till databasen
Det sista steget รคr att ansluta till databasen, hรคmta alla poster i samlingen och visa dem i konsolloggen.
Code Fรถrklaring:
- Lรคgg mรคrke till
connectAsyncmetoden anvรคnds istรคllet fรถr den vanligaconnectmetod. Bluebird lรคgger till Asynk suffix till varje metod i MongoDB bibliotek fรถr att skilja de anrop som returnerar lรถften frรฅn de som inte gรถr det. Metoder utan suffixet Async har ingen sรฅdan garanti. - Liknar
connectAsync, denfindAsyncmetoden returnerar alla poster i MongoDB "Anstรคlld"-kollektionen. - If
findAsynclรถses korrekt itererar fรถljande block igenom varje post i samlingen och visar den i konsolloggen.
Om stegen ovan utfรถrs korrekt visas alla dokument i Employee-samlingen i konsolen, som visas i utdata nedan.
Hรคr รคr den kompletta koden fรถr referens:
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); }); });
โ ๏ธ Anmรคrkning om drivrutinsversion: koden ovan mรฅl MongoDB Noddrivrutin 2.x, dรคr connect lรถser med ett databasobjekt. Frรฅn drivrutinen 3.0 och framรฅt det lรถser sig med en MongoClient, sรฅ kedjan mรฅste ringa client.db('EmployeeDB').collection('Employee') istรคllet fรถr db.collection('Employee')Moderna drivrutinsversioner returnerar ocksรฅ redan inbyggda lรถften, vilket gรถr promisifyAll onรถdig fรถr MongoDB specifikt.
Bluebird vs Native Promises: Vilken ska man anvรคnda
Nรคr Bluebird fรถrst skrevs hade Node inget stรถd fรถr promises alls, sรฅ biblioteket fyllde ett verkligt tomrum i plattformen. Node har levererat native promises sedan version 4 och async/await sedan version 7.6, vilket fรถrรคndrar berรคkningen avsevรคrt fรถr alla som startar ett projekt idag.
| Aspect | Bluebird | Infรถdda lรถften |
|---|---|---|
| Dependency | Ett npm-paket att installera och underhรฅlla | Inbyggt i kรถrtiden |
| Lovande รฅteruppringningar | promisifyAll() konverterar en hel modul |
util.promisify() konverterar en funktion |
| Extra hjรคlpare | karta, filter, rekvisita, varje, timeout, avbokning | alla, allaFaststรคllda, valfri, endast ras |
| Lรฅng stapel traces | Ja, nรคr den รคr aktiverad | Fรถrbรคttrad men kortare |
| Bรคst fรถr | รldre รฅteranropsbibliotek, samtidighetshjรคlpare | Ny kod och allt som anvรคnder async vรคntar |
Vรคlj nativa lรถften fรถr nytt arbete, eftersom de inte behรถver nรฅgot beroende och integreras direkt med async await. Anvรคnd Bluebird nรคr ett beroende fortfarande endast exponerar รฅteranrop, eller nรคr dess samtidighetshjรคlpare, som till exempel Promise.map med en samtidighetsgrรคns, spara en betydande mรคngd kod.
Hur man hanterar fel med Bluebird Promises
Exemplet ovan har ingen felvรคg. Om MongoDB inte kรถrs, eller om samlingsnamnet รคr fel, avvisas kedjan och ingenting skrivs ut โ processen avslutas helt enkelt utan fรถrklaring. Varje lรถfteskedja behรถver en terminalhanterare.
Bluebird-stรถd .catch() fรถr avslag och .finally() fรถr rensning som mรฅste kรถras รฅt bรฅda hรฅllen. Den stรถder รคven typade fรฅngster, som hanterar en felklass medan andra sprider 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 vanor spelar roll hรคr. Fรถr det fรถrsta, plats .catch() i slutet snarare รคn efter varje steg, eftersom en terminalhanterare tar emot avslag frรฅn varje fรถregรฅende lรคnk i kedjan. Fรถr det andra, anvรคnd .finally() fรถr att frigรถra resurser som en databasanslutning, eftersom den kรถrs pรฅ bรฅde lyckade och misslyckade vรคgar. Fรถr det tredje, lรคmna aldrig en kedja utan en fรฅngst: en ohanterad avvisning avslutar Node-processen i aktuella versioner, och Bluebird kommer att skriva ut en uttrycklig varning om det i fรถrvรคg. Aktivera lรฅng stack traces under utveckling med Promise.config({ longStackTraces: true }) gรถr det mycket lรคttare att lokalisera ursprunget till ett avslag.
Vanliga Bluebird Promisify-fel och lรถsningar
De flesta Bluebird-problem uppstรฅr pรฅ grund av namngivningskonventionen Promisified, eller frรฅn att man blandar callback- och promise-anropsstilarna i samma kedja, snarare รคn frรฅn nรฅgot fel i sjรคlva biblioteket. Varje symptom nedan anger dess orsak och lรถsning.
- "connectAsync รคr inte en funktion": modulen behรถvdes direkt istรคllet fรถr via
promisifyAll(), sรฅ inga async-varianter finns. Radbryt require-anropet som visas ovan. - Anropar plain-metoden och fรฅr odefinierad:
connect()fรถrvรคntar sig fortfarande en รฅteranropning. Endast kopian med async-suffixet returnerar ett lรถfte. - Skicka en รฅteranrop till en async-metod: leverera varken en รฅteruppringning eller
awaitoch lรถftet lรถses obemรคrkt. Anvรคnd en stil per anrop, inte bรฅda. - promisifyAll pรฅ ett redan promise-baserat bibliotek: ofarligt men meningslรถst, och det producerar fรถrvirrande namn med dubbla suffix. Kontrollera bibliotekets dokumentation fรถrst.
- Fรถrlora fel i tysthet: en kedja utan
.catch()dรถljer orsaken till avslaget tills Node rapporterar ett ohanterat avslag och avslutar. Avsluta alltid kedjan med en catch, รคven i korta skript.



