sql >> Database teknologi >  >> NoSQL >> MongoDB

Node.js, Mongo finder og returnerer data

Som nævnt i et andet svar, er denne kode asynkron, du kan ikke bare returnere den værdi, du ønsker, ned i kæden af ​​tilbagekald (indlejrede funktioner). Du er nødt til at afsløre en grænseflade, der lader dig signalere opkaldskoden, når du har den ønskede værdi (derfor ringer du tilbage eller ringer tilbage).

Der er et tilbagekaldseksempel i et andet svar, men der er en alternativ mulighed, der absolut er værd at udforske:løfter.

I stedet for en tilbagekaldsfunktion, du kalder med de ønskede resultater, returnerer modulet et løfte, der kan gå ind i to tilstande, opfyldt eller afvist. Opkaldskoden venter på løftet om at gå ind i en af ​​disse to tilstande, den passende funktion kaldes, når den gør det. Modulet udløser tilstandsændringen ved resolve ing eller reject ing. Anyways, her er et eksempel med løfter:

Db1.js:

// db1.js
var MongoClient = require('mongodb').MongoClient;
/*
node.js has native support for promises in recent versions. 
If you are using an older version there are several libraries available: 
bluebird, rsvp, Q. I'll use rsvp here as I'm familiar with it.
*/
var Promise = require('rsvp').Promise;

module.exports = {
  FindinCol1: function() {
    return new Promise(function(resolve, reject) {
      MongoClient.connect('mongodb://localhost:27017/db1', function(err, db) {
        if (err) {
          reject(err);  
        } else {
          resolve(db);
        }        
      }
    }).then(function(db) {
      return new Promise(function(resolve, reject) {
        var collection = db.collection('col1');
        
        collection.find().toArray(function(err, items) {
          if (err) {
            reject(err);
          } else {
            console.log(items);
            resolve(items);
          }          
        });
      });
    });
  }
};


// app.js
var db = require('./db1');
    
db.FindinCol1().then(function(items) {
  console.info('The promise was fulfilled with items!', items);
}, function(err) {
  console.error('The promise was rejected', err, err.stack);
});

Nu, mere opdaterede versioner af node.js mongodb-driveren har indbygget understøttelse af løfter, du behøver ikke at gøre noget arbejde for at ombryde tilbagekald i løfter som ovenfor. Dette er et meget bedre eksempel, hvis du bruger en opdateret driver:

// db1.js
var MongoClient = require('mongodb').MongoClient;
                       
module.exports = {
  FindinCol1: function() {
    return MongoClient.connect('mongodb://localhost:27017/db1').then(function(db) {
      var collection = db.collection('col1');
      
      return collection.find().toArray();
    }).then(function(items) {
      console.log(items);
      return items;
    });
  }
};


// app.js
var db = require('./db1');
    
db.FindinCol1().then(function(items) {
  console.info('The promise was fulfilled with items!', items);
}, function(err) {
  console.error('The promise was rejected', err, err.stack);
});

Løfter giver en fremragende metode til asynkron kontrolstrøm, jeg anbefaler stærkt at bruge lidt tid på at sætte dig ind i dem.



  1. Redis er single-threaded, hvordan gør det så samtidig I/O?

  2. Hvad er nyt i MongoDB 4.2

  3. render_template med flere variabler

  4. Hvordan får man, opdaterer alle nøgler og dens værdier fra redis database i c#?