2016-09-23 6 views
2

Ich versuche, eine kleine Web-App zu bauen, wie ich MEAN Stack Web-Entwicklung zu lernen versuchen.Node.js bekommen Anfrage von MongoDB Rückgabe undefined

Ich habe eine laufende MongoDB mit einer Sammlung namens "Kontaktliste", diese Liste wird dann von einemServer zugegriffen, um die Informationen in ein JSON-Objekt abzurufen und über einen Winkelcontroller zu übergeben.

var express = require('express'); 
var mongojs = require('mongojs'); 
var db = mongojs('contactlist', ['contactlist']); 
var app = express(); 
const port = 80; 

app.use(express.static(__dirname + "/public")); 
app.get('/contactlist', function(req, res){ 
    console.log("I received a GET request") 
    db.contactlist.find(function(err, docs){ 
     console.log("Getting data from db"); 
     console.log(docs); 
     res.json(docs); 
    }); 
    console.log("Returned data"); 
}); 

app.listen(port,'0.0.0.0'); 
console.log('Server running on port '+port); 

Enthalten Code für Controller

var myApp = angular.module('myApp',[]); 

myApp.controller('AppCtrl',['$scope','$http',function ($scope,$http){ 
    console.log("Hello World") 
    console.log("Getting data from server") 
    $http.get('/contactList').success(function(response){ 
     console.log("I got the data I requested"); 
     $scope.contactList = response; 
    }) 
}]); 

Protokoll vom Server:

C:\Users\savila\Documents\Code\contactListApp>node server 
Server running on port 80 
I received a GET request 
Returned data 
Getting data from db 
undefined 
+0

Kudos für Sie nicht mit Mungo. Anstatt "Mongojs" zu verwenden, kann es jedoch sinnvoll sein, stattdessen das 'mongodb'-Paket zu verwenden, welches der offizielle Treiber ist. Der offizielle Fahrer scheint eine viel gründlichere Dokumentation zu haben. "Mongojs" behauptet, die Mongodb API zu implementieren, aber es könnte in einigen Grenzfällen leichte Abweichungen geben, die einige Frustration verursachen könnten. Außerdem werden dem offiziellen Fahrer viel mehr Menschen bekannt sein, sodass Sie leichter Hilfe bekommen. –

Antwort

0

Es alle bisherigen Plakate scheint falsch sind davon ausgegangen, dass Sie den Standard mongodb verwenden Treiberpaket für node, die Sie nicht sind. Gemäß der Dokumentation mongojs ist der Aufruf find mit nur einem Rückruf gültig. Es wird Ihnen ein Array aller Dokumente in der Sammlung geben und Sie müssen kein leeres Objekt, wie zuvor vorgeschlagen, übergeben.

Ehrlich gesagt, lesen Sie durch die mongojs Dokumentation, würde ich davon abraten, das Paket zu verwenden, wie in meinem Kommentar zu Ihrer Frage erläutert. Ihre Dokumentation ist an einigen Stellen etwas verwirrend, und sie erfinden das Rad nur neu, da das mongodb Paket bereits die Funktionalität, die Sie benötigen, und mehr bietet.

Eine Sache, die Sie vermissen, ist, müssen Sie in Ihrem find Rückruf nach Fehlern suchen. Unten ist, wie ich den Code umgestalten würde. Dies löst zwar nicht Ihr Problem, aber es wird zumindest an Ihrer Konsole protokolliert, welchen Fehler Sie bekommen, was wahrscheinlich passiert.

app.get('/contactlist', function(req, res){ 
    console.log("I received a GET request"); 

    db.collection('contactlist').find(function(err, docs){ 
     console.log("Getting data from db"); 

     /* You need to check for errors here. 
      If there is an error in retreiving your data, docs will be undefined 
     */ 

     if (err) { 
      console.log('error from mongodb', err); 
      res.send('error retrieving data') 
      // or however else you want to handle your error 
     } else { 
      console.log('docs from mongodb', docs); 
      res.json(docs); 
      console.log("Returned data"); 
     } 
    }); 

}); 

Auch in Ihrem Winkel Code, Sie wollen wahrscheinlich $scope.contactList = response.data; sagen.Gemäß $http docs wird das Datenfeld des Antwortobjekts die vom Server zurückgegebenen Daten übertragen, während das Antwortobjekt selbst zusätzliche Informationen wie Status, Kopfzeilen usw. enthält.

Hoffe, das hilft. Bitte kommentieren Sie, wenn Sie Fragen haben oder eine Klärung benötigen. Viel Glück beim Lernen des MEAN-Stacks.

Auch zu Ihrem Vorteil, hier sind die mongojs docs und die mongodb docs, und wieder würde ich empfehlen, letztere zu verwenden.

0

Sie sind nicht das Bestehen der query Objekt

Pass leere Abfrage Objekt {}, um alle Einzelteile zu erhalten

Syntax von find query

db.collection.find (Abfrage, Projektion)

prüfen doc für Fund Abfrage find()

app.get('/contactlist', function(req, res){ 
    console.log("I received a GET request") 
    db.contactlist.find({},function(err, docs){ 
     console.log("Getting data from db"); 
     console.log(docs); 
     res.json(docs); 
    }); 
    console.log("Returned data"); 
}); 
0

Es kann sein, dass Ihre Verbindung mit mongo Datenbank ist nicht festzustellen, oder andere mehrere mögliche Probleme, aber Hauptproblem ist, dass nicht query object

übergeben

Pass leere Abfrage Objekt {} zu erhalten alle Elemente oder für spezifische Auswahl Rekord wie diese vergänglichen {'key':data'}

db.contactlist.findOne({},function(err, docs){ 
     console.log("Getting data from db"); 
     console.log(docs); 
     res.json(docs); 
    });