sql >> Databáze >  >> NoSQL >> MongoDB

Node.js, Mongo vyhledá a vrátí data

Jak je uvedeno v jiné odpovědi, tento kód je asynchronní, nemůžete jednoduše vrátit požadovanou hodnotu v řetězci zpětných volání (vnořené funkce). Musíte odhalit nějaké rozhraní, které vám umožní signalizovat volací kód, jakmile získáte požadovanou hodnotu (proto je zavoláte zpět nebo zavoláte zpět).

V jiné odpovědi je uveden příklad zpětného volání, ale existuje alternativní možnost, která rozhodně stojí za prozkoumání:sliby.

Místo funkce zpětného volání, kterou zavoláte s požadovanými výsledky, modul vrátí příslib, který může vstoupit do dvou stavů, splněných nebo zamítnutých. Volací kód čeká na příslib, že vstoupí do jednoho z těchto dvou stavů, a když se tak stane, zavolá se příslušná funkce. Modul spouští změnu stavu pomocí resolve ing nebo reject ing. Každopádně zde je příklad použití slibů:

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

Nyní, aktuálnější verze ovladače node.js mongodb mají nativní podporu pro sliby, nemusíte dělat žádnou práci, abyste zabalili zpětná volání do slibů, jako je uvedeno výše. Toto je mnohem lepší příklad, pokud používáte aktuální ovladač:

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

Sliby poskytují vynikající metodu pro asynchronní řídicí tok, velmi doporučuji věnovat nějaký čas tomu, abyste se s nimi seznámili.



  1. Seskupit podle stavu v MongoDB

  2. Socket.io, Redis Store a IE

  3. Meteorická stránka se obnovuje kliknutím na tlačítko

  4. render_template s více proměnnými