2016-06-19 8 views
1

Ich möchte ein Modul verwenden, um Daten aus meiner MongoDB-Datenbank zu erhalten und zu verarbeiten. (Es soll ein Objekt erzeugen, die meine Express.js Website navbar darstellt)Node.js-Modul zum Abrufen von Daten aus MongoDB-Datenbank

Ich dachte an so etwas wie dies zu tun:

var nav = { Home: "/" }; 
module.exports = function() { 
    MongoClient.connect(process.env.MONGO_URL, function(err, db) { 
    assert.equal(err, null); 
    fetchData(db, function(articles, categories) { 
     combine(articles, categories, function(sitemap) { 
     // I got the data. What now? 
     console.log("NAV: ", nav); 
     }) 
    }); 
    }); 
}; 

var fetchData = function(db, callback) { 
    db.collection('articles').find({}).toArray(function(err, result) { 
    assert.equal(err); 
    articles = result; 
    db.collection('categories').find({}).toArray(function(err, result) { 
     assert.equal(err); 
     categories = result; 
     db.close(); 
     callback(articles, categories); 
    }); 
    }); 
}; 

var combine = function(articles, categories, callback) { 
    categories.forEach(function(category) { 
    nav[category.title] = {}; 
    articles.forEach(function(article) { 
     if(article.category == category.name) { 
     nav[category.title][article.title] = "link"; 
     } 
    }) 
    }); 
    callback(nav); 
}; 

Ab Linie 6, ich habe zu tun alle Daten, die ich brauche.

(Ein Objekt, wie currenty { Home: '/', Uncategorized: { 'Hello world!': 'link' } })

Aber da ich in einer anonymen Funktion bin, weiß ich nicht, wie man diesen Wert zurückzukehren. Ich meine, return würde nur die Funktion zurückgeben, die es aufgerufen hat ... Und am Ende würde MongoClient.connect meine Daten erhalten.

Wenn ich stattdessen eine Variable setze, würde es als module.exports zurückgegeben werden, bevor Node sogar die Daten aus der Datenbank abfragen kann, richtig?

Was kann ich tun, damit dies funktioniert?

Es sollte in einer Art Funktion zur Folge hat, wie

var nav = require('nav'); 
console.log(nav()); 

Vielen Dank im Voraus!

+0

Sie können die gewünschten Daten immer mithilfe von Rückrufen zurückgeben. – Nonemoticoner

+0

@Nonemoticoner Wie? Ich bin neu bei Node.js, tut mir leid. – 22samuelk

+0

Ich habe eine Antwort gepostet. Hoffentlich richtig, da ich es momentan nicht testen kann. Schreiben Sie einen Kommentar, wenn Fehler auftreten. – Nonemoticoner

Antwort

1

einen anderen Rückruf hinzufügen:

var nav = { Home: "/" }; 
module.exports = function(cb) { 
    MongoClient.connect(process.env.MONGO_URL, function(err, db) { 
     assert.equal(err, null); 
     fetchData(db, function(articles, categories) { 
      combine(articles, categories, function(sitemap) { 
       cb(sitemap); 
      }) 
     }); 
    }) 
}); 

Und dann benutze diesen Weg:

var nav = require('nav'); 
nav(function(sitemap){ console.log(sitemap); }); 
+0

Danke, das funktioniert! (: – 22samuelk

1

Sie können Mungo-Modul oder Mönch Modul verwenden. Diese Module wurden ordnungsgemäß getestet.

Gerade

npm installieren Mungo verwenden oder

+2

Das sollte irgendwie noch mit dem offiziellen Modul funktionieren. Wenn ich keine Lösung finden kann, werde ich es mit Mungo versuchen. Danke für den Vorschlag! – 22samuelk

0

Der Vorschlag über Mungo Mönch ist groß und man kann hineinschauen, aber ich glaube, Sie bereits die Arbeit mit dem Abrufen von getan haben die Daten von der db. Sie müssen nur in Ihrem Hauptknotenfluss darauf zugreifen.

Sie können dies versuchen:

module.exports.generateNav = function() { 
    MongoClient.connect(process.env.MONGO_URL, function(err, db) { 
    assert.equal(err, null); 
    var output = fetchData(db, function(articles, categories) { 
     combine(articles, categories, function(sitemap) { 

     }) 
    }); 
    return (output); 
    }); 
}; 

Und dann in die Hauptanwendung Sie es auf folgende Weise aufrufen:

var nav = require('nav'); 
navigation = nav.generateNav(); 
console.log(navigation); 
+0

Das war auch meine Idee. Aber Sie scheinen mein Problem nicht wirklich zu verstehen ... Wenn ich fetchData eine return-Anweisung hinzufüge, werden die Daten an 'db.collection ('categories') übergeben. Find ({}). ToArray', was nicht der Fall ist Sinn machen ... – 22samuelk

+0

'fetchData' Funktion ist asynchron. Ich sehe das kaum so, wie du es hier geschrieben hast. "output" wird höchstwahrscheinlich "undefined" sein. – Nonemoticoner

+0

@Nonemoticoner Korrigieren. – 22samuelk

Verwandte Themen