Node.js从MongoDB获取请求返回undefined

时间:2016-09-23 18:09:33

标签: angularjs node.js mongodb express mean-stack

当我尝试学习MEAN堆栈Web开发时,我正在尝试构建一个小型Web应用程序。

我有一个名为' contactlist'的正在运行的MongoDB,然后Node.js/Express.js服务器将访问此列表以将信息检索到JSON对象并通过角度控制器传递

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);

包含控制器的代码

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;
    })
}]);

从服务器登录:

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

3 个答案:

答案 0 :(得分:0)

您没有传递query对象

传递空查询对象{}以获取所有项目

find query

的语法
  

db.collection.find(查询,投影)

检查doc查找查询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");
});

答案 1 :(得分:0)

可能是您与mongo数据库的连接未建立或其他几个可能的问题,但主要问题是未通过query object

将空查询对象{}传递给获取所有项选择特定记录 像这样传递{'key':data'}

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

答案 2 :(得分:0)

似乎所有以前的海报都错误地认为您使用mongodb的标准node驱动程序包,而您并非如此。根据{{​​1}}文档,仅使用回调调用mongojs是有效的。它将为您提供集合中所有文档的数组,并且您不需要传入空对象,如前所述。

老实说,通过阅读find文档,我建议不要使用该软件包,正如我对您的问题的评论中所述。他们的文档在某些地方有点混乱,实际上它们只是重新发明轮子,因为mongojs包已经提供了你需要的功能,等等。

但是,您要丢失的一件事是,您需要检查mongodb回调中的错误。下面是我如何重构代码。这可能无法解决您的问题,但它至少会在您的控制台上记录您遇到的错误,这可能就是发生的事情。

find

此外,在您的角度代码中,您可能想说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"); } }); }); 。根据{{​​3}},响应对象的数据字段将携带从服务器返回的数据,而响应对象本身包含其他信息,如状态,标题等。

希望这会有所帮助。如果您有任何疑问或需要澄清,请发表评论。祝你好好学习MEAN堆栈。

另外,为了您的利益,这里有$http docsmongojs docs,我建议再次使用后者。