MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Node.js, Mongo localizam e retornam dados


Conforme mencionado em outra resposta, esse código é assíncrono, você não pode simplesmente retornar o valor desejado na cadeia de retornos de chamada (funções aninhadas). Você precisa expor alguma interface que permita sinalizar o código de chamada assim que tiver o valor desejado (portanto, chamando-os de volta ou callback).

Há um exemplo de retorno de chamada fornecido em outra resposta, mas há uma opção alternativa que definitivamente vale a pena explorar:promessas.

Em vez de uma função de retorno de chamada que você chama com os resultados desejados, o módulo retorna uma promessa que pode entrar em dois estados, cumprido ou rejeitado. O código de chamada aguarda a promessa de entrar em um desses dois estados, a função apropriada sendo chamada quando isso acontece. O módulo aciona a mudança de estado por resolve ing ou reject ing. De qualquer forma, aqui está um exemplo usando promessas:

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

Agora, versões mais atualizadas do driver node.js mongodb têm suporte nativo para promessas, você não precisa fazer nenhum trabalho para envolver retornos de chamada em promessas como acima. Este é um exemplo muito melhor se você estiver usando um driver atualizado:


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

Promessas fornecem um excelente método para fluxo de controle assíncrono, eu recomendo passar algum tempo se familiarizando com elas.