sql >> Base de Datos >  >> NoSQL >> MongoDB

Node.js, Mongo encuentra y devuelve datos

Como se mencionó en otra respuesta, este código es asíncrono, no puede simplemente devolver el valor que desea en la cadena de devoluciones de llamada (funciones anidadas). Debe exponer alguna interfaz que le permita señalar el código de llamada una vez que tenga el valor deseado (por lo tanto, devolver la llamada o devolver la llamada).

Hay un ejemplo de devolución de llamada proporcionado en otra respuesta, pero definitivamente hay una opción alternativa que vale la pena explorar:promesas.

En lugar de una función de devolución de llamada a la que llama con los resultados deseados, el módulo devuelve una promesa que puede entrar en dos estados, cumplida o rechazada. El código de llamada espera a que la promesa entre en uno de estos dos estados, y cuando lo hace se llama a la función apropiada. El módulo activa el cambio de estado mediante resolve ing o reject En g. De todos modos, aquí hay un ejemplo usando promesas:

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

Ahora, las versiones más actualizadas del controlador mongodb node.js tienen soporte nativo para promesas, no tiene que hacer ningún trabajo para envolver las devoluciones de llamada en promesas como la anterior. Este es un ejemplo mucho mejor si está utilizando un controlador actualizado:

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

Las promesas brindan un método excelente para el flujo de control asíncrono, recomiendo encarecidamente que dedique un tiempo a familiarizarse con ellas.