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!
Sie können die gewünschten Daten immer mithilfe von Rückrufen zurückgeben. – Nonemoticoner
@Nonemoticoner Wie? Ich bin neu bei Node.js, tut mir leid. – 22samuelk
Ich habe eine Antwort gepostet. Hoffentlich richtig, da ich es momentan nicht testen kann. Schreiben Sie einen Kommentar, wenn Fehler auftreten. – Nonemoticoner