2012-07-27 23 views
11

ich mit mongodb herumgespielt wurde und einige Testdaten {name: „david“} trat in die Sammlung ‚Nutzer‘. Ich überprüfte, dass die Daten in MongoDB wurde von der Mongo-Shell eingebennode.js MongoDB Abfrage Ergebnisse Rückkehr

db.users.find() 

Ergebnis:

{ "name":"david" } 

In node.js Skript den folgenden Code:

db.open(function(err, db) { 
    if (!err) { 
     console.log("db opened!"); 
    } 
    else { 
     console.log(err); 
    } 
    db.collection('users', function(err, collection) { 
     collection.find({}, function(err, cursor) { 
      cursor.each(function(err, item) { 
       console.log(item); 
      }); 
     }); 
    }); 
    db.close(); 
}); 

nicht zurückgibt alle Ergebnisse

ich sehe nichts falsch, und keine err kehrt zurück. Bitte geben Sie

Antwort

9

Sie Ihre Datenbankverbindung tatsächlich schließen, bevor Daten aus der Sammlung zurückgekehrt ist.

2

Dieses Muster in meinem Knoten/Mongo Probe fein arbeitet. Der Funktion wird ein Callback übergeben, der err, collection übernimmt. Es wird die Sammlung ‚Nutzer‘ und wenn sie erfolgreich sind, ruft gegen die Sammlung finden und wandelt es in ein Array, aber Sie können auch auf dem Cursor durchlaufen.

Innerhalb der db.collection- und connection.find-Aufrufe suchen Sie nicht nach Fehlern und Fehlern. Du machst es nur beim offenen Anruf.

Sie sollten db.close() auch nicht aufrufen, besonders wenn Sie mit connection pool option öffnen (Sie wollen die Verbindung nicht bei jedem Anruf öffnen und schließen). Wenn Sie schließen wollten, schließen Sie dann innerhalb des Rückrufs.

Etwas wie:

var server = new Server(host, port, {auto_reconnect: true, poolSize: 5}, {}); 

MyStore.prototype.getUsers = function(callback) { 
server.open(function(err, db) { 
    if (err) { 
     callback(err); 
    } 
    else { 
     db.collection('users', function(err, collection) { 
      if(err) 
       callback(err); 
      else { 
       collection.find().toArray(function(err, users) { 
        if (err) { 
         callback(err) 
        } else { 
         callback(null, users); 
        } 
       }); 
      } 
     } 
    }}); 

Hier ist ein weiteres Tutorial auf Knoten + Mongo, die helfen können: http://howtonode.org/express-mongodb

4

Wie CJohn korrekt angibt, schließen Sie die DB-Verbindung BEVOR Sie die Daten abrufen. Ich weiß es nicht, wie es aussieht, aber dies ist der Fall mit Knotenstruktur und Rückrufen. Der Code, um dies richtig zu behandeln, ist:

db.open(function(err, db) { 
    if (err) return console.log('error opening db, err = ', err); 

    console.log("db opened!"); 

    db.collection('users', function(err, collection) { 
     if (err) return console.log('error opening users collection, err = ', err); 

     collection.find({}, function(err, cursor) { 
      if (err) return console.log('error initiating find on users, err = ', err); 

      cursor.each(function(err, item) { 
       // watch for both errors and the end of the data 
       if (err || ! item) { 
        // display (or do something more interesting) with the error 
        if (err) console.log('error walking data, err = ', err); 

        // close the connection when done OR on error 
        db.close(); 

        return; 
       } 
       console.log(item); 
      }); 
     }); 
    }); 
}); 
3

Versuchen Sie, Ihren Knoten auf die neueste Version zu aktualisieren.

sudo npm cache clean -f 
sudo npm install -g n 
sudo n stable 

Version 0.4 funktioniert möglicherweise nicht richtig.