【问题标题】:Node.js get request from MongoDB returning undefinedNode.js 从 MongoDB 获取请求返回未定义
【发布时间】:2017-02-01 16:28:46
【问题描述】:

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

我有一个正在运行的 MongoDB,其中包含一个名为“contactlist”的集合,然后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

【问题讨论】:

  • 感谢您不使用猫鼬。然而,与其使用mongojs,不如使用官方驱动程序mongodb 包。官方驱动程序似乎有更详尽的文档。 mongojs 声称实现了 mongodb api,但在某些边缘情况下可能会有轻微的偏差,这可能会导致一些挫败感。此外,更多人会熟悉官方驱动程序,因此您会发现更容易获得帮助。

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


【解决方案1】:

您没有传递query 对象

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

find query的语法

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      似乎之前的所有发帖者都错误地假设您正在使用标准的mongodb 驱动程序包来支持node,而实际上并非如此。根据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");
              }
          });
      
      });
      

      另外,在您的角度代码中,您可能想说$scope.contactList = response.data;。根据$http docs的说法,响应对象的数据字段将携带服务器返回的数据,而响应对象本身包含附加信息,如状态、标头等。

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

      另外,为了您的利益,这里是mongojs docsmongodb docs,我再次建议使用后者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 2021-09-29
        • 2018-08-09
        相关资源
        最近更新 更多