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,我再次建议您使用后者。
我正在尝试构建一个小型网络应用程序,因为我正在尝试学习 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,我再次建议您使用后者。