2016-05-14 9 views
0

Ich bin ziemlich neu in node.js und mongodb. Ich brauche eine Funktion, die ein Array mit Ergebnissen aus der Datenbank zurückgibt. Wenn ich 'SELECT * FROM table' in PHP abfrage, gibt es Array oder Array von Objekten zurück. Aber mit Node und Mongo muss ich viel Code verwenden, was mir so unnötig erscheint. Also schrieb ich diese Funktion:MongoDB + node.js - SQL Entsprechendes auswählen

select: function (table, terms) { 
    var rows = []; 
    var find = function (error, db) { 
     var collection = db.collection(table); 
     var docs = collection.find(terms); 
     docs.each(function (error, doc) { 
      rows.push(doc); 
     }); 
    }; 
    client.connect(url, find); 
    return rows; 
} 

Es Tabellennamen [string] und Begriffe [js object] als Argument nimmt. Und ich möchte diese Funktion ein Array wie folgt zurückgeben: [{doc1}, {doc2}, {doc3}, ...]. Wenn ich Variable doc protokollieren, ist es in jeder Funktion in Ordnung - gültiges Javascript-Objekt. Aber wenn ich nach dem Verschieben aller Dokumente variable Zeilen protokolliere, ist es leer - []. Auch das Ergebnis von function select() ist leeres Array - [].

Bitte, gibt es jemanden, der eine Idee hat, was ein Problem sein könnte oder wer eine ähnliche Methode verwendet, um Daten von MongoDB zu holen? Danke

+0

Sie noch ORM wie Mungo verwenden können. – YOU

Antwort

0

Die Verbindungsfunktion ist asynchron und endet nach Ihrer Rückkehranweisung. Setzen Sie Ihre Return-Anweisung innerhalb der Callback-Funktion, direkt nach der schließenden Klammer von docs.each (.....); Auf diese Weise können Sie sicher sein, dass Ihre Return-Anweisung ausgeführt wird, nachdem Ihr Array gefüllt wurde.

Edit für die Vollständigkeit: eine Rückgabeanweisung funktioniert natürlich nicht, weil es von der Funktion in finden zurückgibt. Arbeiten Sie mit einer Rückruffunktion.

So:

select: function (table, terms, cb) { 
    var rows = []; 
    var find = function (error, db) { 
     var collection = db.collection(table); 
     var docs = collection.find(terms); 
     docs.each(function (error, doc) { 
      rows.push(doc); 
     }); 
     cb(error, rows); 
    }; 
    client.connect(url, find); 
} 

Edit: Im obigen Beispiel (cb Funktion statt return)

+0

Nun, ich habe das versucht, aber das Problem ist, die Return-Anweisung ist jetzt in Callback-Funktion, so dass Zeilen innerhalb Callback nicht innerhalb der Funktion select zurückgibt. Wenn ich jetzt wähle, gibt es nichts zurück (Funktion ohne Rückgabewert) - undefiniert. Ich denke, das ist eine große Grenze innerhalb des gesamten Javascript, wie man Wert vom Rückruf zurückgibt. Aber danke –

+0

Ja stimmt, das übersieht das. Um dies zu umgehen, könnten Sie einen dritten Parameter an die select-Funktion übergeben, die eine weitere Callback-Funktion ist. Funktion (Tabelle, Begriffe, cb). Wenn Sie fertig sind, rufen Sie return cb (rows) oder besser cb (error, rows) auf. – Keugels

+0

Ja, das ist eine gute Idee, leider verwende ich Projektstruktur, die das ziemlich kompliziert macht. Es gibt ein Modell für den Zugriff auf die Datenbank (Code oben ist von dort), wenn HTTP-Route aufgerufen wird, rufe ich eine Funktion aus einem bestimmten Modell, von hier wählen Funktion aufgerufen wird und dann Ergebnisse verarbeitet und formatierte Daten zurück zur Route. Es würde also sehr viele Rückrufe erfordern. Aber es scheint, ich muss es auf diese Art und Weise voll von Rückrufen machen. Vielleicht führe ich in Zukunft Mungo oder so etwas ein. –