如何:将node.js mongodb结果传递给angularjs?

所以我有一个使用Node.js查询的MongoDB

数据没有被发送出去使用这个function,我不知道什么是错的

var findIco = function(db, callback) { var cursor =db.collection('footIco').find(); cursor.each(function(err, doc) { // console.log(err); if (doc != null) { console.log(doc); <------ DISPLAY THE DATA IN THE CONSOLE } else { callback(); } }); }; app.get('/icons', function(req, res){ //calling the function MongoClient.connect(url, function(err, db) { if(err) { console.log(err); return res.status(500).send(err); } findIco(db, function(icons) { res.header("Access-Control-Allow-Origin", "*"); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type"); console.log(icons);<--------------- IS UNDEFINED res.json(icons); db.close(); return; }); }); }); app.listen(8080); 

我究竟做错了什么?

您需要使用某种forms的Web服务器来创build一个API,以便在某个资源收到请求时返回这些数据。 您可以使用Angular应用程序中的$http服务向您的API发送请求。 对于一个Node web框架来说,最stream行的select是Express ,它包装了Node Core HTTP模块并提供了一个强大的API 。

其他热门Node.js Web框架

  • 兴亚
  • Hapi.js

这些只是一些Node.js Web框架,我也排除了任何基于MVC框架的框架,比如Meteor和Sails.js,因为Angular已经提供了这个框架。

要在Express中快速启动并运行,您可以使用Express-Generator来搭build基本的Express API。 然后在你的Node.js服务器上添加一个你的函数的路由。

findIco

 var findIco = function(db, callback) { db.collection('footIco').find().toArray(function(err, docs) { if (err) return callback(err, null); return callback(null, docs); }); } 

Node.js API

 app.get('/icons', function getIcons(req, res){ //calling the function MongoClient.connect(url, function(err, db) { if(err) { console.log(err); return res.status(500).json(err); } findIco(db, function(err, icons) { if (err) res.status(500).json(err); else { if (!icons) res.status(204).send(); else res.json(icons); } db.close(); return; }); }); }); 

footIconCtrl调用$http

 app.controller('footIconCtrl', ['$scope', '$http', function($scope, $http){ $scope.icons = []; $http({ method: 'GET', url: 'http://<serverAddress>:<serverPort>/icons' }) .then(function(icons) { $scope.icons = icons.data; }) .catch(function(errRes) { // Handle errRess }); }); 

在你的angular码中,你将得到一个像getDocument.controller.js这样的文件,带有一个http调用你的服务的函数。 像这样的东西:

 var getDocs = function(){ var apis = http://localhost:9000/api/getDocs; httpRequest.get(apis). then(function(docs){ // Your code to handle the response }); }; 

现在在你的服务器端代码中,你可以发送响应

 CollectionName.find({}, function (err, docs) { if (err) return next(err); if (!docs) return res.send(401); res.json(docs); });