Bluebird NPM: Bluebird JS Belofte met voorbeeld
⚡ Slimme samenvatting
Bluebird JS is een volledig functionele Promise-bibliotheek voor JavaScript waarvan de belangrijkste functionaliteit promisificatie is: het omzetten van op callbacks gebaseerde Node-modules naar modules die promises retourneren, zodat een complete bibliotheek zoals de MongoDB De driver kan asynchroon worden gebruikt.

Wat is Bluebird JS?
Bluebird JS is een volledig functionele Promise-bibliotheek voor JavaScript. De grootste kracht ervan is dat je hiermee andere Node-modules kunt "promisifiëren" om ze asynchroon te gebruiken. Promisifiëren is een concept dat wordt toegepast op callback-functies en zorgt ervoor dat elke aangeroepen callback-functie een waarde retourneert.
Dus als een Node.js Als de module een callbackfunctie bevat die geen waarde retourneert, wordt beloofd dat de module automatisch alle functies erin aanpast, zodat elke functie een waarde retourneert.
Dit betekent dat je Bluebird kunt gebruiken om de MongoDB De module wordt asynchroon uitgevoerd, wat het schrijven van Node.js-applicaties nog eenvoudiger maakt.
Het onderstaande voorbeeld legt eerst een verbinding met de "Employee"-collectie in de "EmployeeDB"-database. Zodra de verbinding tot stand is gebracht, worden alle records in de collectie opgehaald en in de console weergegeven.
Hoe u beloften kunt genereren met Bluebird JS Library
Hieronder volgt een stapsgewijs voorbeeld dat laat zien hoe je promises kunt genereren met de Bluebird JS-bibliotheek.
Stap 1) De NPM-modules installeren
Om Bluebird vanuit een Node-applicatie te gebruiken, is de Bluebird-module vereist. Installeer deze met het onderstaande commando:
npm install bluebird
Stap 2) Voeg de Bluebird-module toe
De volgende stap is het opnemen van de Bluebird-module in je code en het omzetten van de gehele module naar een Promise. MongoDB module. "Promisifying" betekent hier dat Bluebird ervoor zorgt dat elke methode die in de module is gedefinieerd, ook daadwerkelijk wordt uitgevoerd. MongoDB bibliotheek geeft een belofte terug.
Code Uitleg:
- De
requireHet commando maakt gebruik van de Bluebird-bibliotheek. - Blauwe vogel
.promisifyAll()methode creëert een asynchrone versie van elke methode MongoDB De module biedt de benodigde functionaliteit, zodat elke module op de achtergrond draait en een promise retourneert.
Stap 3) Verbinden met de database
De laatste stap is verbinding maken met de database, alle records in de verzameling ophalen en deze weergeven in het consolelogboek.
Code Uitleg:
- Let op de
connectAsyncDeze methode wordt gebruikt in plaats van de normale methode.connectmethode. Bluebird voegt de toe asynchrone achtervoegsel bij elke methode in de MongoDB De bibliotheek maakt onderscheid tussen aanroepen die een promise retourneren en aanroepen die dat niet doen. Methoden zonder het achtervoegsel Async bieden deze garantie niet. - Soortgelijke
connectAsyncfindAsyncmethode retourneert alle records in de MongoDB Collectie "Werknemer". - If
findAsyncAls de bewerking succesvol is afgerond, doorloopt het volgende blok elk record in de verzameling en geeft het weer in de consolelog.
Als de bovenstaande stappen correct worden uitgevoerd, worden alle documenten in de werknemersverzameling in de console weergegeven, zoals in de onderstaande uitvoer te zien is.
Hieronder vindt u de volledige code ter referentie:
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); }); });
⚠️ Opmerking over de driverversie: de bovenstaande code is gericht op MongoDB Node-stuurprogramma 2.x, waar connect Lost op met een databaseobject. Van driver 3.0 verder het wordt opgelost met een MongoClient, dus de keten moet bellen client.db('EmployeeDB').collection('Employee') in plaats van db.collection('Employee')Moderne driverversies retourneren ook al native promises, wat zorgt voor promisifyAll onnodig voor MongoDB in het bijzonder.
Bluebird versus Native Promises: welke te gebruiken?
Toen Bluebird voor het eerst werd geschreven, bood Node nog helemaal geen ondersteuning voor promises, dus de bibliotheek vulde een echte leemte in het platform. Node biedt sinds versie 4 native ondersteuning voor promises. async/await Sinds versie 7.6 verandert dit de berekening aanzienlijk voor iedereen die vandaag een project start.
| Aspect | Bluebird | Inheemse Beloften |
|---|---|---|
| Afhankelijkheid | Een npm-pakket om te installeren en te onderhouden. | Ingebouwd in de runtime |
| Beloftevolle terugbelverzoeken | promisifyAll() converteert een complete module |
util.promisify() converteert een functie |
| Extra helpers | kaart, filter, eigenschappen, elk, time-out, annulering | alle, volledig geregeld, elk, alleen ras |
| Lange stapel traces | Ja, indien ingeschakeld | Verbeterd, maar korter |
| Best voor | Verouderde callback-bibliotheken, hulpmiddelen voor gelijktijdigheid | Nieuwe code, en alles wat gebruikmaakt van `async await`. |
Kies native promises voor nieuw werk, omdat deze geen afhankelijkheden vereisen en direct integreren met async await. Gebruik Bluebird wanneer een afhankelijkheid nog steeds alleen callbacks beschikbaar stelt, of wanneer de concurrency-hulpmiddelen, zoals Promise.map Met een gelijktijdigheidslimiet bespaar je een aanzienlijke hoeveelheid code.
Hoe om te gaan met fouten bij Bluebird Promises
Het bovenstaande voorbeeld kent geen faalpad. Als MongoDB Als de collectie niet draait of de collectienaam onjuist is, wordt de keten afgewezen en wordt er niets afgedrukt — het proces stopt zonder enige uitleg. Elke promise-keten heeft een eindhandler nodig.
Bluebird ondersteunt .catch() voor afwijzingen en .finally() Voor opruimacties die hoe dan ook moeten worden uitgevoerd. Het ondersteunt ook getypte catch-blokken, die één type fout afhandelen terwijl andere fouten zich blijven verspreiden.
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(); } });
Drie gewoonten zijn hier van belang. Ten eerste, plaats .catch() aan het einde in plaats van na elke stap, omdat één eindhandler afwijzingen ontvangt van elke voorgaande schakel in de keten. Ten tweede, gebruik .finally() voor het vrijgeven van resources zoals een databaseverbinding, aangezien dit zowel in het succesvolle als in het mislukte geval wordt uitgevoerd. Ten derde, laat een keten nooit zonder een catch-blok achter: een onafgehandelde afwijzing beëindigt het Node-proces in de huidige versies, en Bluebird zal hierover vooraf een expliciete waarschuwing afdrukken. Het inschakelen van een lange stack traces tijdens de ontwikkeling met Promise.config({ longStackTraces: true }) Hierdoor is de oorzaak van een afwijzing veel gemakkelijker te achterhalen.
Veelvoorkomende fouten en oplossingen bij Bluebird Promisify
De meeste problemen met Bluebird komen voort uit de naamgevingsconventie met promiscue-notaties, of uit het combineren van callbacks en promises in dezelfde keten, in plaats van uit een fout in de bibliotheek zelf. Bij elk symptoom hieronder wordt de oorzaak en de oplossing genoemd.
- “connectAsync is geen functie”: De module werd direct opgevraagd in plaats van via
promisifyAll()Er bestaan dus geen asynchrone varianten. Wikkel de `require`-aanroep in zoals hierboven weergegeven. - De eenvoudige methode aanroepen en 'undefined' terugkrijgen:
connect()Er wordt nog steeds een callback verwacht. Alleen de versie met het achtervoegsel Async retourneert een promise. - Een callback doorgeven aan een asynchrone methode: noch een terugbelverzoek indienen, noch
awaiten de belofte wordt onopgemerkt afgehandeld. Gebruik één stijl per aanroep, niet beide. - promisifyAll op een bibliotheek die al op promises gebaseerd is: Onschadelijk maar zinloos, en het levert verwarrende namen met dubbele achtervoegsels op. Raadpleeg eerst de bibliotheekdocumentatie.
- Fouten ongemerkt kwijtraken: een ketting zonder
.catch()Verbergt de reden van de afwijzing totdat Node een onafgehandelde afwijzing meldt en afsluit. Beëindig de keten altijd met een catch-blok, zelfs in korte scripts.



