Bluebird NPM : promesse Bluebird JS avec exemple
โก Rรฉsumรฉ intelligent
Bluebird JS est une bibliothรจque de promesses complรจte pour JavaScript dont la principale caractรฉristique est la promisification : convertir des modules Node basรฉs sur des rappels en modules renvoyant des promesses, de sorte quโune bibliothรจque entiรจre telle que MongoDB Le pilote peut รชtre utilisรฉ de maniรจre asynchrone.

Quโest-ce que Bluebird JS ?
Bluebird JS est une bibliothรจque de promesses complรจte pour JavaCe script a pour principal atout la possibilitรฉ de ยซ promisifier ยป d'autres modules Node afin de les utiliser de maniรจre asynchrone. La promesse est un concept appliquรฉ aux fonctions de rappel, garantissant que chaque fonction de rappel appelรฉe renvoie une valeur.
Donc si un Node.js Le module contient une fonction de rappel qui ne renvoie pas de valeur, ce qui implique que le module modifie automatiquement toutes ses fonctions afin que chacune renvoie une valeur.
Cela signifie que vous pouvez utiliser Bluebird pour fabriquer le MongoDB Le module s'exรฉcute de maniรจre asynchrone, ce qui simplifie encore davantage le dรฉveloppement d'applications Node.js.
L'exemple ci-dessous รฉtablit d'abord une connexion ร la collection ยซ Employee ยป de la base de donnรฉes ยซ EmployeeDB ยป. Une fois la connexion รฉtablie, il rรฉcupรจre tous les enregistrements de la collection et les affiche dans la console.
Comment gรฉnรฉrer des promesses avec la bibliothรจque Bluebird JS
Voici un exemple รฉtape par รฉtape montrant comment gรฉnรฉrer des promesses avec la bibliothรจque JS Bluebird.
รtape 1) Installation des modules NPM
Pour utiliser Bluebird dans une application Node, le module Bluebird est requis. Installez-le avec la commande ci-dessous :
npm install bluebird
รtape 2) Inclure le module Bluebird
L'รฉtape suivante consiste ร inclure le module Bluebird dans votre code et ร convertir l'ensemble en promesse. MongoDB module. Promettre ici signifie que Bluebird garantit que chaque mรฉthode dรฉfinie dans le module MongoDB la bibliothรจque renvoie une promesse.
Code Explication:
- Le
requireCette commande inclut la bibliothรจque Bluebird. - Le merlebleu
.promisifyAll()Cette mรฉthode crรฉe une version asynchrone de chaque mรฉthode. MongoDB Ce module fournit des fonctions qui s'exรฉcutent en arriรจre-plan et renvoient une promesse.
รtape 3) Se connecter ร la base de donnรฉes
La derniรจre รฉtape consiste ร se connecter ร la base de donnรฉes, ร rรฉcupรฉrer tous les enregistrements de la collection et ร les afficher dans la console.
Code Explication:
- Notez le
connectAsyncLa mรฉthode est utilisรฉe ร la place de la mรฉthode normaleconnectmรฉthode. Bluebird ajoute le Async suffixe ร chaque mรฉthode dans le MongoDB Cette bibliothรจque permet de distinguer les appels qui renvoient des promesses de ceux qui n'en renvoient pas. Les mรฉthodes sans le suffixe Async n'offrent aucune garantie de ce type. - Similaire ร
connectAsync, lefindAsyncla mรฉthode renvoie tous les enregistrements dans le MongoDB Collection ยซ Employรฉ ยป. - If
findAsyncUne fois la rรฉsolution rรฉussie, le bloc suivant parcourt chaque enregistrement de la collection et l'affiche dans la console.
Si les รฉtapes ci-dessus sont correctement effectuรฉes, tous les documents de la collection Employรฉ s'affichent dans la console, comme indiquรฉ dans le rรฉsultat ci-dessous.
Voici le code complet pour rรฉfรฉrence :
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); }); });
โ ๏ธ Note concernant la version du pilote : Le code ci-dessus cible MongoDB Pilote Node 2.x, oรน connect se rรฉsout avec un objet de base de donnรฉes. ร partir du pilote 3.0 ร partir de maintenant il se rรฉsout avec un MongoClient, la chaรฎne doit donc appeler client.db('EmployeeDB').collection('Employee') au lieu de db.collection('Employee')Les versions modernes des pilotes renvoient dรฉjร des promesses natives, ce qui rend promisifyAll inutile pour MongoDB Plus prรฉcisรฉment.
Bluebird ou Native Promises : lequel utiliser ?
Lors de sa premiรจre conception, Bluebird ne prenait pas en charge les promesses dans Node.js ; la bibliothรจque comblait donc une vรฉritable lacune de la plateforme. Node.js intรจgre les promesses natives depuis la version 4. async/await Depuis la version 7.6, ce qui modifie considรฉrablement le calcul pour toute personne dรฉmarrant un projet aujourd'hui.
| Aspect | Bluebird | Promesses autochtones |
|---|---|---|
| Dรฉpendance | Un package npm ร installer et ร maintenir | Intรฉgrรฉ ร l'environnement d'exรฉcution |
| Des rappels prometteurs | promisifyAll() convertit un module entier |
util.promisify() convertit une fonction |
| Aides supplรฉmentaires | carte, filtre, propriรฉtรฉs, chaque, dรฉlai d'expiration, annulation | tous, tous rรฉglรฉs, n'importe quelle race seulement |
| Pile longue traces | Oui, lorsqu'il est activรฉ | Amรฉliorรฉ mais plus court |
| Meilleur pour | Bibliothรจques de rappel hรฉritรฉes, outils d'aide ร la concurrence | Nouveau code, et tout ce qui utilise async await |
Pour les nouveaux dรฉveloppements, privilรฉgiez les promesses natives, car elles ne nรฉcessitent aucune dรฉpendance et s'intรจgrent directement avec `async/await`. Utilisez Bluebird lorsqu'une dรฉpendance n'expose que des fonctions de rappel, ou lorsque ses outils de gestion de la concurrence, tels queโฆ Promise.map Avec une limite de concurrence, รฉconomisez une quantitรฉ significative de code.
Comment gรฉrer les erreurs avec les promesses Bluebird
L'exemple ci-dessus ne comporte aucun chemin d'รฉchec. Si MongoDB Si la chaรฎne de promesses ne s'exรฉcute pas ou si le nom de la collection est incorrect, elle est rejetรฉe et aucun affichage n'est effectuรฉ : le processus se termine simplement sans explication. Chaque chaรฎne de promesses nรฉcessite un gestionnaire de fin de chaรฎne.
Bluebird soutient .catch() pour les rejets et .finally() pour le nettoyage qui doit รชtre exรฉcutรฉ dans tous les cas. Il prend รฉgalement en charge les blocs catch typรฉs, qui gรจrent une classe d'erreurs tout en laissant les autres se propager.
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(); } });
Trois habitudes sont importantes ici. Premiรจrement, la place .catch() ร la fin plutรดt qu'aprรจs chaque รฉtape, car un gestionnaire de terminal reรงoit les rejets de chaque maillon prรฉcรฉdent de la chaรฎne. Deuxiรจmement, utilisez .finally() Pour la libรฉration de ressources telles qu'une connexion ร une base de donnรฉes, car cette opรฉration s'exรฉcute aussi bien en cas de succรจs qu'en cas d'รฉchec. Troisiรจmement, il ne faut jamais laisser une chaรฎne sans gestion de rejet : un rejet non gรฉrรฉ met fin au processus Node sur les versions actuelles, et Bluebird affichera un avertissement explicite au prรฉalable. Activation de la pile longue traces pendant le dรฉveloppement avec Promise.config({ longStackTraces: true }) facilite grandement la localisation de l'origine d'un rejet.
Erreurs et correctifs de Common Bluebird Promisify
La plupart des problรจmes rencontrรฉs avec Bluebird proviennent de la convention de nommage basรฉe sur les promesses, ou du mรฉlange des styles d'appel de callback et de promesse dans une mรชme chaรฎne, plutรดt que d'un dรฉfaut de la bibliothรจque elle-mรชme. Chaque symptรดme ci-dessous indique sa cause et sa solution.
- ยซ connectAsync nโest pas une fonction ยป : Le module รฉtait requis directement et non par le biais de
promisifyAll()Il n'existe donc pas de variantes asynchrones. Encapsulez l'appel require comme indiquรฉ ci-dessus. - Appel de la mรฉthode simple et obtention de la valeur indรฉfinie :
connect()Attend toujours un rappel. Seule la copie avec le suffixe Async renvoie une promesse. - Passer une fonction de rappel ร une mรฉthode asynchrone : ne fournir ni rappel ni
awaitet la promesse est rรฉsolue sans observation. Utilisez un style par appel, pas les deux. - promisifyAll sur une bibliothรจque dรฉjร basรฉe sur les promesses : Sans danger mais inutile, cela produit des noms ร double suffixe sources de confusion. Consultez d'abord la documentation de la bibliothรจque.
- Erreurs de perte silencieuses : une chaรฎne sans
.catch()Masque la raison du rejet jusqu'ร ce que Node signale un rejet non gรฉrรฉ et s'arrรชte. Terminez toujours la chaรฎne par un bloc catch, mรชme dans les scripts courts.



