MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Node.js, Mongo trouvent et renvoient des données

Comme mentionné dans une autre réponse, ce code est asynchrone, vous ne pouvez pas simplement renvoyer la valeur souhaitée dans la chaîne de rappels (fonctions imbriquées). Vous devez exposer une interface qui vous permet de signaler le code d'appel une fois que vous avez la valeur souhaitée (par conséquent, les rappeler ou les rappeler).

Il y a un exemple de rappel fourni dans une autre réponse, mais il y a une option alternative qui vaut vraiment la peine d'être explorée :les promesses.

Au lieu d'une fonction de rappel que vous appelez avec les résultats souhaités, le module renvoie une promesse qui peut entrer dans deux états, remplie ou rejetée. Le code appelant attend que la promesse entre dans l'un de ces deux états, la fonction appropriée étant alors appelée. Le module déclenche le changement d'état par resolve ing ou reject ing. Quoi qu'il en soit, voici un exemple utilisant des promesses :

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);
});

Maintenant, des versions plus récentes du pilote mongodb node.js ont un support natif pour les promesses, vous n'avez pas à faire de travail pour encapsuler les rappels dans des promesses comme ci-dessus. C'est un bien meilleur exemple si vous utilisez un pilote à jour :

// 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);
});

Les promesses fournissent une excellente méthode pour le flux de contrôle asynchrone, je vous recommande fortement de passer un peu de temps à vous familiariser avec elles.