Bluebird NPM: Bluebird JS-Versprechen mit Beispiel
⚡ Intelligente Zusammenfassung
Bluebird JS ist eine voll ausgestattete Promise-Bibliothek für JavaEin Skript, dessen Kernkompetenz die Promisifizierung ist: die Umwandlung von Callback-basierten Node-Modulen in Module, die Promises zurückgeben, sodass eine ganze Bibliothek wie die MongoDB Der Treiber kann asynchron verwendet werden.

Was ist Bluebird JS?
Bluebird JS ist eine voll ausgestattete Promise-Bibliothek für JavaDas Skript zeichnet sich dadurch aus, dass es die Verwendung anderer Node-Module durch Promises ermöglicht, um diese asynchron zu nutzen. Promises sind ein Konzept, das auf Callback-Funktionen angewendet wird und sicherstellt, dass jede aufgerufene Callback-Funktion einen Wert zurückgibt.
Also wenn a Node.js Das Modul enthält eine Callback-Funktion, die keinen Wert zurückgibt. Durch die Promisifizierung des Moduls werden automatisch alle Funktionen darin so modifiziert, dass jede einzelne einen Wert zurückgibt.
Das bedeutet, dass Sie Bluebird verwenden können, um Folgendes zu erstellen: MongoDB Das Modul wird asynchron ausgeführt, was die Entwicklung von Node.js-Anwendungen zusätzlich vereinfacht.
Das folgende Beispiel stellt zunächst eine Verbindung zur Sammlung „Employee“ in der Datenbank „EmployeeDB“ her. Sobald die Verbindung hergestellt ist, werden alle Datensätze der Sammlung abgerufen und in der Konsole angezeigt.
So generieren Sie Versprechen mit der Bluebird JS Library
Hier ist ein Beispiel, das Schritt für Schritt zeigt, wie man mit der Bluebird JS-Bibliothek Promises generiert.
Schritt 1) Installation der NPM-Module
Um Bluebird innerhalb einer Node-Anwendung zu verwenden, wird das Bluebird-Modul benötigt. Installieren Sie es mit dem folgenden Befehl:
npm install bluebird
Schritt 2) Fügen Sie das Bluebird-Modul hinzu.
Der nächste Schritt besteht darin, das Bluebird-Modul in Ihren Code einzubinden und den gesamten Code in Promises zu verwandeln. MongoDB Modul. Versprechen bedeutet hier, dass Bluebird sicherstellt, dass jede im Modul definierte Methode MongoDB Die Bibliothek gibt ein Versprechen zurück.
Code Erläuterung:
- Das
requireDer Befehl beinhaltet die Bluebird-Bibliothek. - Blaumeisen
.promisifyAll()Die Methode erstellt eine asynchrone Version jeder Methode. MongoDB Das Modul stellt dies bereit, sodass jede Instanz im Hintergrund ausgeführt wird und ein Promise zurückgibt.
Schritt 3) Verbindung zur Datenbank herstellen
Der letzte Schritt besteht darin, eine Verbindung zur Datenbank herzustellen, alle Datensätze der Sammlung abzurufen und sie im Konsolenprotokoll anzuzeigen.
Code Erläuterung:
- Beachten Sie die
connectAsyncAnstelle der normalen Methode wird diese verwendet.connectMethode. Bluebird fügt die Asynchron Suffix für jede Methode in der MongoDB Eine Bibliothek, die Aufrufe mit Promise-Rückgabe von solchen ohne Promise-Rückgabe unterscheidet. Methoden ohne das Suffix „Async“ bieten keine solche Garantie. - Ähnlich
connectAsync, hat dasfindAsyncDie Methode gibt alle Datensätze im MongoDB Sammlung „Mitarbeiter“. - If
findAsyncWenn die Auflösung erfolgreich war, durchläuft der folgende Block jeden Datensatz in der Sammlung und zeigt ihn im Konsolenprotokoll an.
Wenn die oben genannten Schritte ordnungsgemäß ausgeführt werden, werden alle Dokumente der Mitarbeitersammlung in der Konsole angezeigt, wie in der folgenden Ausgabe dargestellt.
Hier ist der vollständige Code als Referenz:
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); }); });
⚠️ Hinweis zur Treiberversion: Der obige Code zielt auf MongoDB Node-Treiber 2.x, wobei connect Wird mit einem Datenbankobjekt aufgelöst. Vom Treiber 3.0 weiter Es löst sich mit einem auf MongoClientDie Kette muss also aufrufen client.db('EmployeeDB').collection('Employee') statt db.collection('Employee')Moderne Treiberversionen geben bereits native Promises zurück, was promisifyAll unnötig für MongoDB speziell.
Bluebird vs. Native Promises: Welches ist das richtige?
Als Bluebird entwickelt wurde, bot Node.js keinerlei Unterstützung für Promises, daher füllte die Bibliothek eine echte Lücke in der Plattform. Node.js unterstützt Promises seit Version 4 nativ. async/await seit Version 7.6, was die Berechnung für alle, die heute ein Projekt beginnen, erheblich verändert.
| Aspekt | Bluebird | Native Promises |
|---|---|---|
| Abhängigkeit | Ein npm-Paket zum Installieren und Warten | In die Laufzeitumgebung integriert |
| Vielversprechende Rückrufe | promisifyAll() konvertiert ein ganzes Modul |
util.promisify() wandelt eine Funktion um |
| Zusätzliche Helfer | map, filter, props, each, timeout, cancellation | alle, alle geregelt, jede, nur Rasse |
| Langer Stapel traces | Ja, wenn aktiviert | Verbessert, aber kürzer |
| am besten für | Legacy-Callback-Bibliotheken, Hilfsfunktionen für die Parallelverarbeitung | Neuer Code und alles, was async/await verwendet. |
Verwenden Sie für neue Projekte native Promises, da diese keine Abhängigkeiten benötigen und sich direkt in async/await integrieren lassen. Greifen Sie auf Bluebird zurück, wenn eine Abhängigkeit nur Callbacks bereitstellt oder wenn deren Hilfsfunktionen für die Parallelverarbeitung, wie z. B. … Promise.map Durch die Begrenzung der Parallelverarbeitung lässt sich eine beträchtliche Menge Code einsparen.
Wie man Fehler bei Bluebird-Promises behandelt
Das obige Beispiel hat keinen Fehlerpfad. Wenn MongoDB Wenn die Kette nicht läuft oder der Sammlungsname falsch ist, wird sie abgelehnt und es wird nichts ausgegeben – der Prozess beendet sich einfach ohne Erklärung. Jede Promise-Kette benötigt einen Terminal-Handler.
Bluebird unterstützt .catch() für Ablehnungen und .finally() Für Aufräumarbeiten, die in jedem Fall ausgeführt werden müssen. Es unterstützt außerdem typisierte Catch-Anweisungen, die eine Fehlerklasse behandeln, während andere Fehler weitergeleitet werden.
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(); } });
Drei Gewohnheiten sind hier wichtig. Erstens, Platz .catch() Am Ende und nicht nach jedem Schritt, da ein Terminalhandler von jedem vorhergehenden Glied der Kette Ablehnungen empfängt. Zweitens: Verwenden Sie .finally() zum Freigeben von Ressourcen wie Datenbankverbindungen, da dies sowohl im Erfolgs- als auch im Fehlerfall ausgeführt wird. Drittens: Lassen Sie niemals eine Kette ohne Catch-Anweisung: Eine unbehandelte Ablehnung beendet den Node-Prozess in aktuellen Versionen, und Bluebird gibt vorher eine explizite Warnung aus. Aktivieren des Long Stacks traces während der Entwicklung mit Promise.config({ longStackTraces: true }) Dadurch wird es wesentlich einfacher, den Ursprung einer Ablehnung zu finden.
Häufige Bluebird Promisify-Fehler und deren Behebung
Die meisten Probleme mit Bluebird entstehen durch die Verwendung von Promises oder durch die Vermischung von Callback- und Promise-Aufrufen in derselben Kette, und nicht durch einen Fehler in der Bibliothek selbst. Jedes der folgenden Symptome wird mit seiner Ursache und Lösung beschrieben.
- „connectAsync ist keine Funktion“: Das Modul musste direkt anstatt über den Kanal benötigt werden.
promisifyAll()Daher existieren keine asynchronen Varianten. Umschließen Sie den require-Aufruf wie oben gezeigt. - Beim Aufruf der einfachen Methode wird „undefined“ zurückgegeben:
connect()Es wird weiterhin ein Callback erwartet. Nur die mit dem Suffix „Async“ versehene Kopie gibt ein Promise zurück. - Übergabe eines Callbacks an eine asynchrone Methode: weder einen Rückruf noch
awaitund das Promise wird unbeachtet aufgelöst. Verwenden Sie pro Aufruf einen Stil, nicht beide. - promisifyAll auf einer bereits auf Promises basierenden Bibliothek: Harmlos, aber sinnlos, und es führt zu verwirrenden Namen mit doppelten Suffixen. Lesen Sie zuerst die Bibliotheksdokumentation.
- Fehler stillschweigend verlieren: eine Kette ohne
.catch()Der Ablehnungsgrund wird so lange verborgen, bis Node eine unbehandelte Ablehnung meldet und beendet wird. Die Kette sollte immer mit einem catch-Block beendet werden, auch in kurzen Skripten.



