sql >> Databasteknik >  >> NoSQL >> MongoDB

Node.js, Mongo hitta och returnera data

Som nämnts i ett annat svar är den här koden asynkron, du kan inte bara returnera det värde du vill ha i kedjan av återuppringningar (kapslade funktioner). Du måste avslöja något gränssnitt som låter dig signalera anropskoden när du har det önskade värdet (därav ringa tillbaka dem eller ringa tillbaka).

Det finns ett exempel på återuppringning i ett annat svar, men det finns ett alternativ som definitivt är värt att utforska:löften.

Istället för en återuppringningsfunktion du anropar med önskat resultat, returnerar modulen ett löfte som kan gå in i två tillstånd, uppfyllt eller avvisat. Anropskoden väntar på löftet att gå in i ett av dessa två tillstånd, den lämpliga funktionen anropas när den gör det. Modulen utlöser tillståndsändringen genom resolve ing eller reject ing. Hur som helst, här är ett exempel med löften:

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, mer uppdaterade versioner av node.js mongodb-drivrutinen har inbyggt stöd för löften, du behöver inte göra något arbete för att omsluta återuppringningar i löften som ovan. Detta är ett mycket bättre exempel om du använder en uppdaterad drivrutin:

// 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öften är en utmärkt metod för asynkront kontrollflöde, jag rekommenderar starkt att du lägger lite tid på att bekanta dig med dem.



  1. Installera Redis på Ubuntu 16.04/18.04

  2. Infoga ett värde vid en specifik position i en array i MongoDB

  3. Matcha med delsträng i mongodb-aggregation

  4. nestJS socket.io-redis:6.0.1