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

Node.js, Mongo trova e restituisce i dati

Come accennato in un'altra risposta, questo codice è asincrono, non puoi semplicemente restituire il valore che desideri lungo la catena di callback (funzioni nidificate). Devi esporre un'interfaccia che ti permetta di segnalare il codice chiamante una volta ottenuto il valore desiderato (quindi, richiamandoli o richiamati).

C'è un esempio di callback fornito in un'altra risposta, ma c'è un'opzione alternativa che vale sicuramente la pena esplorare:le promesse.

Invece di una funzione di callback che chiami con i risultati desiderati, il modulo restituisce una promessa che può entrare in due stati, soddisfatta o rifiutata. Il codice chiamante attende che la promessa entri in uno di questi due stati, quando lo fa viene chiamata la funzione appropriata. Il modulo attiva il cambio di stato tramite resolve ing o reject ing. Ad ogni modo, ecco un esempio che utilizza le promesse:

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

Ora, le versioni più aggiornate del driver node.js mongodb hanno il supporto nativo per le promesse, non è necessario eseguire alcun lavoro per racchiudere i callback in promesse come sopra. Questo è un esempio molto migliore se stai utilizzando un driver aggiornato:

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

Le promesse forniscono un metodo eccellente per il flusso di controllo asincrono, consiglio vivamente di dedicare un po' di tempo a familiarizzare con esse.