Bluebird NPM: Υπόσχεση Bluebird JS με Παράδειγμα
⚡ Έξυπνη Σύνοψη
Το Bluebird JS είναι μια πλήρως εξοπλισμένη βιβλιοθήκη Promise για JavaΣκριπτ του οποίου η καθοριστική ικανότητα είναι η υπόσχεση: μετατροπή ενοτήτων Node που βασίζονται σε επανάκληση σε ενότητες που επιστρέφουν υποσχέσεις, έτσι ώστε μια ολόκληρη βιβλιοθήκη όπως η MongoDB Το πρόγραμμα οδήγησης μπορεί να χρησιμοποιηθεί ασύγχρονα.

Τι είναι το Bluebird JS;
Το Bluebird JS είναι μια πλήρως εξοπλισμένη βιβλιοθήκη Promise για JavaΣενάριο. Το ισχυρότερο χαρακτηριστικό του είναι ότι σας επιτρέπει να "υπόσχεστε" άλλες μονάδες Node για να τις χρησιμοποιείτε ασύγχρονα. Το Promisify είναι μια έννοια που εφαρμόζεται σε συναρτήσεις επανάκλησης και διασφαλίζει ότι κάθε συνάρτηση επανάκλησης που καλείται επιστρέφει μια τιμή.
Έτσι εάν Node.js Η ενότητα περιέχει μια συνάρτηση επανάκλησης η οποία δεν επιστρέφει τιμή, υπόσχοντας ότι η ενότητα τροποποιεί αυτόματα όλες τις συναρτήσεις σε αυτήν, έτσι ώστε η καθεμία να επιστρέφει μια τιμή.
Αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε το Bluebird για να δημιουργήσετε το MongoDB η ενότητα εκτελείται ασύγχρονα, γεγονός που προσθέτει ένα ακόμη επίπεδο ευκολίας κατά τη σύνταξη εφαρμογών Node.js.
Το παρακάτω παράδειγμα δημιουργεί πρώτα μια σύνδεση με τη συλλογή "Employee" στη βάση δεδομένων "EmployeeDB". Μόλις δημιουργηθεί η σύνδεση, ανακτά όλες τις εγγραφές της συλλογής και τις εμφανίζει στην κονσόλα.
Πώς να δημιουργήσετε υποσχέσεις με τη βιβλιοθήκη Bluebird JS
Ακολουθεί ένα βήμα προς βήμα παράδειγμα που δείχνει πώς να δημιουργήσετε υποσχέσεις με τη βιβλιοθήκη Bluebird JS.
Βήμα 1) Εγκατάσταση των μονάδων NPM
Για να χρησιμοποιήσετε το Bluebird μέσα από μια εφαρμογή Node, απαιτείται η ενότητα Bluebird. Εγκαταστήστε την με την παρακάτω εντολή:
npm install bluebird
Βήμα 2) Συμπεριλάβετε την ενότητα Bluebird
Το επόμενο βήμα είναι να συμπεριλάβετε την ενότητα Bluebird στον κώδικά σας και να υποσχεθείτε ολόκληρο το MongoDB ενότητα. Αυτό που υπόσχεται εδώ σημαίνει ότι η Bluebird διασφαλίζει ότι κάθε μέθοδος που ορίζεται στο MongoDB η βιβλιοθήκη επιστρέφει μια υπόσχεση.
Code Επεξήγηση:
- The
requireΗ εντολή περιλαμβάνει τη βιβλιοθήκη Bluebird. - Bluebird's
.promisifyAll()Η μέθοδος δημιουργεί μια ασύγχρονη έκδοση κάθε μεθόδου. MongoDB παρέχει η ενότητα, έτσι ώστε κάθε μία να εκτελείται στο παρασκήνιο και να επιστρέφει μια υπόσχεση.
Βήμα 3) Σύνδεση με τη βάση δεδομένων
Το τελευταίο βήμα είναι η σύνδεση στη βάση δεδομένων, η ανάκτηση όλων των εγγραφών στη συλλογή και η εμφάνισή τους στο αρχείο καταγραφής της κονσόλας.
Code Επεξήγηση:
- Παρατηρήστε το
connectAsyncχρησιμοποιείται η μέθοδος αντί της κανονικήςconnectμέθοδος. Το Bluebird προσθέτει το Ασύγ επίθημα σε κάθε μέθοδο στο MongoDB βιβλιοθήκη για να διακρίνει τις κλήσεις που επιστρέφουν υποσχέσεις από εκείνες που δεν τις επιστρέφουν. Οι μέθοδοι χωρίς το επίθημα Async δεν έχουν τέτοια εγγύηση. - Παρόμοια με
connectAsync,findAsyncΗ μέθοδος επιστρέφει όλες τις εγγραφές στο MongoDB Συλλογή «Υπάλληλος». - If
findAsyncΕάν το πρόβλημα επιλυθεί με επιτυχία, το ακόλουθο μπλοκ επαναλαμβάνεται σε κάθε εγγραφή στη συλλογή και την εμφανίζει στο αρχείο καταγραφής της κονσόλας.
Εάν τα παραπάνω βήματα εκτελεστούν σωστά, όλα τα έγγραφα στη συλλογή Employee εμφανίζονται στην κονσόλα, όπως φαίνεται στο παρακάτω αποτέλεσμα.
Εδώ είναι ο πλήρης κώδικας για αναφορά:
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); }); });
⚠️ Σημείωση έκδοσης προγράμματος οδήγησης: ο παραπάνω κώδικας στοχεύει MongoDB Πρόγραμμα οδήγησης κόμβου 2.x, όπου connect επιλύεται με ένα αντικείμενο βάσης δεδομένων. Από το πρόγραμμα οδήγησης 3.0 και μετά λύνεται με ένα MongoClient, επομένως η αλυσίδα πρέπει να καλέσει client.db('EmployeeDB').collection('Employee') αντί του db.collection('Employee')Οι σύγχρονες εκδόσεις προγραμμάτων οδήγησης επιστρέφουν ήδη εγγενείς υποσχέσεις, γεγονός που καθιστά promisifyAll περιττό για MongoDB ΕΙΔΙΚΑ.
Bluebird vs Native Promises: Ποιο να χρησιμοποιήσετε
Όταν γράφτηκε για πρώτη φορά το Bluebird, το Node δεν είχε καθόλου υποστήριξη υποσχέσεων, επομένως η βιβλιοθήκη κάλυψε ένα πραγματικό κενό στην πλατφόρμα. Το Node έχει παραδώσει εγγενείς υποσχέσεις από την έκδοση 4 και μετά. async/await από την έκδοση 7.6, η οποία αλλάζει σημαντικά τον υπολογισμό για όποιον ξεκινά ένα έργο σήμερα.
| Άποψη | Bluebird | Εγγενείς Υποσχέσεις |
|---|---|---|
| Εξάρτηση | Ένα πακέτο npm για εγκατάσταση και συντήρηση | Ενσωματωμένο στον χρόνο εκτέλεσης |
| Υποσχόμενες επανεκκλήσεις | promisifyAll() μετατρέπει μια ολόκληρη ενότητα |
util.promisify() μετατρέπει μία συνάρτηση |
| Επιπλέον βοηθοί | χάρτης, φίλτρο, στηρίγματα, κάθε, χρονικό όριο, ακύρωση | όλοι, όλοιΕγκατεστημένοι, οποιαδήποτε, μόνο φυλή |
| Μακριά στοίβα traces | Ναι, όταν είναι ενεργοποιημένο | Βελτιωμένο αλλά μικρότερο |
| καλυτερα for | Βιβλιοθήκες παλαιού τύπου επανάκλησης, βοηθοί ταυτόχρονης χρήσης | Νέος κώδικας και οτιδήποτε χρησιμοποιεί ασύγχρονη λειτουργία αναμονής |
Επιλέξτε εγγενείς υποσχέσεις για νέα εργασία, καθώς δεν χρειάζονται εξάρτηση και ενσωματώνονται απευθείας με την ασύγχρονη αναμονή. Επιλέξτε το Bluebird όταν μια εξάρτηση εξακολουθεί να εκθέτει μόνο επανακλήσεις ή όταν οι βοηθοί ταυτόχρονης χρήσης, όπως π.χ. Promise.map με ένα όριο ταυτόχρονης χρήσης, εξοικονομήστε μια σημαντική ποσότητα κώδικα.
Πώς να χειριστείτε σφάλματα με τις υποσχέσεις Bluebird
Το παραπάνω παράδειγμα δεν έχει διαδρομή αποτυχίας. Αν MongoDB δεν εκτελείται ή το όνομα της συλλογής είναι λανθασμένο, η αλυσίδα απορρίπτει και δεν εκτυπώνεται τίποτα — η διεργασία απλώς τερματίζεται χωρίς εξήγηση. Κάθε αλυσίδα υποσχέσεων χρειάζεται έναν χειριστή τερματικού.
Το Bluebird υποστηρίζει .catch() για απορρίψεις και .finally() για καθαρισμό που πρέπει να εκτελεστεί με οποιονδήποτε τρόπο. Υποστηρίζει επίσης πληκτρολογημένα catches, τα οποία χειρίζονται μια κατηγορία σφαλμάτων ενώ επιτρέπουν σε άλλες να διαδοθούν.
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(); } });
Τρεις συνήθειες έχουν σημασία εδώ. Πρώτον, ο τόπος .catch() στο τέλος και όχι μετά από κάθε βήμα, επειδή ένας χειριστής τερματικού λαμβάνει απορρίψεις από κάθε προηγούμενο σύνδεσμο στην αλυσίδα. Δεύτερον, χρησιμοποιήστε .finally() για την απελευθέρωση πόρων όπως μια σύνδεση βάσης δεδομένων, καθώς εκτελείται τόσο στη διαδρομή επιτυχίας όσο και στη διαδρομή αποτυχίας. Τρίτον, μην αφήνετε ποτέ μια αλυσίδα χωρίς κάποιο σφάλμα: μια μη χειριζόμενη απόρριψη τερματίζει τη διεργασία Node στις τρέχουσες εκδόσεις και το Bluebird θα εκτυπώσει μια ρητή προειδοποίηση σχετικά με αυτήν εκ των προτέρων. Ενεργοποίηση μεγάλης στοίβας tracκατά την ανάπτυξη με Promise.config({ longStackTraces: true }) καθιστά πολύ πιο εύκολο τον εντοπισμό της πηγής μιας απόρριψης.
Συνηθισμένα σφάλματα και διορθώσεις του Bluebird Promisify
Τα περισσότερα προβλήματα του Bluebird προέρχονται από τη σύμβαση ονομασίας promisified ή από την ανάμειξη των στυλ κλήσης επανάκλησης και κλήσης promise στην ίδια αλυσίδα, και όχι από κάποιο σφάλμα στην ίδια τη βιβλιοθήκη. Κάθε σύμπτωμα παρακάτω αναφέρει την αιτία και τη λύση του.
- «Το connectAsync δεν είναι συνάρτηση»: η ενότητα απαιτήθηκε απευθείας αντί μέσω
promisifyAll(), επομένως δεν υπάρχουν παραλλαγές Async. Τυλίξτε την κλήση require όπως φαίνεται παραπάνω. - Κλήση της απλής μεθόδου και απροσδιόριστη μετάβαση:
connect()εξακολουθεί να αναμένει επανάκληση. Μόνο το αντίγραφο με επίθημα Async επιστρέφει μια υπόσχεση. - Διαβίβαση μιας επανάκλησης σε μια μέθοδο Async: δεν παρέχει ούτε επανάκληση ούτε
awaitκαι η υπόσχεση λύνεται απαρατήρητη. Χρησιμοποιήστε ένα στυλ ανά κλήση, όχι και τα δύο. - promisifyAll σε μια βιβλιοθήκη που βασίζεται ήδη σε promisify: ακίνδυνο αλλά άσκοπο, και παράγει μπερδεμένα ονόματα με διπλό επίθημα. Ελέγξτε πρώτα την τεκμηρίωση της βιβλιοθήκης.
- Χάνοντας λάθη σιωπηλά: μια αλυσίδα χωρίς
.catch()Αποκρύπτει την αιτία απόρριψης μέχρι ο κόμβος να αναφέρει μια μη επεξεργασμένη απόρριψη και να τερματίζει. Πάντα να τερματίζει την αλυσίδα με ένα catch, ακόμα και σε σύντομα σενάρια.



