Node.js 从 MongoDB 获取返回未定义的请求

Node.js get request from MongoDB returning undefined

我正在尝试构建一个小型网络应用程序,因为我正在尝试学习 MEAN 堆栈网络开发。

我有一个 运行 MongoDB 和一个名为 'contactlist' 的集合,然后 Node.js/Express.js 服务器将访问此列表以将信息检索到 JSON 对象并将其传递给 angular 控制器。

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

您没有传递 query 对象

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

find query

的语法

db.collection.find(query, projection)

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

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

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

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

似乎所有以前的发帖人都错误地认为您使用的是 node 的标准 mongodb driver 包,而您不是。根据 mongojs 文档,仅使用回调调用 find 是有效的。它将为您提供 collection 中所有文档的数组,并且您不需要像之前建议的那样传入空的 object。

老实说,通读 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");
        }
    });

});

此外,在您的 angular 代码中,您可能想说 $scope.contactList = response.data;。根据 $http docs,响应 object 的数据字段将携带从服务器返回的数据,而响应 object 本身包含其他信息,如状态,headers,等等。

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

此外,为了您的利益,这里有 mongojs docs and the mongodb docs,我再次建议您使用后者。