无法通过express / mongoose / angularjs从Mongodb访问数据

我正在使用MEAN堆栈来处理简单的自定义CMS。 这是我的第一个networking应用程序,我用它来学习绳索,因为它是。 不幸的是我无法从mongodb访问数据。 mongodb服务正在运行,数据在那里(当我通过db.news.find()查看时,我将两个新闻文档插入到mongo shell的“news”集合中)。 因为我添加了样本数据(两个文档)和'db.news.insert(var)'。

所以我需要的是能够从数据库获取新闻数据,并将其发送到angular.js客户端,然后将其显示在每个路由的固定框中。 然后,当然,我需要能够在angular度客户端中编辑数据,将其发送回服务器并将其保存到数据库。 很基本的东西。 我知道我的angular码工作正常,因为当我使用一个实际的对象,并将其绑定到范围我可以访问和查看数据。 以下是我如何从angular度访问数据库:我已经用注释描述了所遇到的所有问题。 请注意那些标有< – 和^ – 的。 干杯

angular.module('App', ['ngResource']) .controller('NewsCtrl', function($scope, $resource){ var News = $resource('/'); var news = News.query(); console.log(news); // ^- No news logged in the console - sometimes I am getting an empty array, // sometimes an 'undefined' and asometimes an array of approx. 2761 elements // where each is a single character. Characters form patterns like this - // [{"0":"<"},{"0":"!"},{"0":"D"},{"0":"O"},{"0":"C"},{"0":"T"},{"0":"Y"}, // {"0":"P"},{"0":"E"},{"0":" "},{"0":"h"},{"0":"t"},{"0":"m"},{"0":"l"}, // {"0":">"},...] // When all the characters are assembled they form '<!DOCTYPE html>' - // hmm... somewhat sounds familiar, but not what I expected. // The whole array appears to be the HTML of the very website encoded // in an array of objects character by character. $scope.news = news; // <- No data available in the scope, or displays the same array mentioned above. // $scope.news = news[0]; // <- No data available in the scope, or displays the same array mentioned above. // $scope.news = { // <- This puts the data in the scope just fine. // headline: "Huseyin Ozer at Wimbledon", // bd: "Wimbledon Championships arranged between 24th of June – 7th of July. I followed all the finals with pleasure. In women final Bartoli won the prize but Lisicki won everybody' s heart with her outgoingness. With Andy Murray I shared the pride of British people.", // imgURI: encodeURI("images/news/wimbledon.jpg"), // imgThumbURI: encodeURI("images/news/thumbs/wimbledon.jpg"), // imgCaption: "Wimbledon finals were amazing. I am sharing the pride of British people.", // addedOn: new Date(), // addedBy: "Admin" // } }); 

以下是我的networking服务器的代码:

 /** * Module dependencies. */ var express = require('express') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path') , fs = require('fs'); // Defining connection to the database: var mongoose = require('mongoose'). connect("mongodb://localhost:27017/huseyin-ozer"), db = mongoose.connection; var Schema = mongoose.Schema; var ObjectID = Schema.ObjectId; // Setting up the debug flag: mongoose.set('debug, true'); // Logging connection: db .on('error', console.error.bind(console, 'DB connection error.')) .once('open', console.log.bind(console, 'DB Connection established.')); // Defining MongoDB schemas: var husOzSchema = new Schema({ }); var usr = new Schema({ first: String, last: String }); var newsSchema = new Schema({ headline: String, bd: String, imgURI: String, imgThumbURI: String, imgCaption: String, addedOn: Date, addedBy: { type: ObjectID, ref: 'usr' } // {first: String, // last: String} }); // On user action 'save' populate the addedOn and addedBy fields before the news article is actually saved to the DB: newsSchema.pre('save', function(next){ if( !this.addedOn ) this.addedOn = new Date(); if( !this.addedBy ) this.addedBy = {first: "admin", last: "admin"}; }); // Indexing important fields: usr.index({last: 1}); newsSchema.index({headline: 1}); //Adding the News model: var News = mongoose.model('News', newsSchema); //Creating and saving some test data to MongoDB: //var nws1 = new News({ // headline: "Huseyin Ozer at Wimbledon", // bd: "Wimbledon Championships arranged between 24th of June – 7th of July. I followed all the finals with pleasure. In women final Bartoli won the prize but Lisicki won everybody' s heart with her outgoingness. With Andy Murray I shared the pride of British people.", // imgURI: encodeURI("images/news/wimbledon.jpg"), // imgThumbURI: encodeURI("images/news/thumbs/wimbledon.jpg"), // imgCaption: "Wimbledon finals were amazing. I am sharing the pride of British people.", // addedOn: new Date(), // addedBy: "Admin" //}); //var nws2 = new News({ // headline: "David Miliband's Goodbye Party", // bd: "David Miliband choose his favourite restaurant from many alternatives. His goodbye party was held at OZER Restaurant before he will go to New York. On that night many of Labour Party deputies signed the book called ' The History of Labour Party' as a gift for Mr. Ozer.", // imgURI: encodeURI("images/news/DMGoodbye.jpg"), // imgThumbURI: encodeURI("images/news/thumbs/DMGoodbye.jpg"), // imgCaption: "Farewell party at Ozer.", // addedOn: new Date(), // addedBy: "Admin" // }); // For some reason upon running the server, the data is not stored in the DB using the code below. Why is that? //nws1.save(function(err, news){ // if(err) return console.error("Error while saving data to MongoDB: " + err); // ^- no error displayed in the console. All ok?... // console.dir(news); // <- ... not really. No data displayed in the console either. // }); //nws2.save(function(err, news){ // <- same as above // if(err) return console.error("Error while saving data to MongoDB: " + err); // console.dir(news); // }); var app = express(); // all environments app.set('port', process.env.PORT || 3000); app.set('views', path.resolve(__dirname + '/public')); app.set('view engine', 'html') .engine('html', function(path, options, fn){ if('finction' == typeof options){ fn = options, options = {}; } fs.readFile(path, 'utf8', fn); }); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('your secret here')); app.use(express.session()); //app.use(app.router); // <- When I uncomment this the website doesn't render at all. all I see is a couple of square brackets - '[]' app.use(express.static(path.join(__dirname, 'public'))); <- when I move this below the routes defined below, I am also getting a blank page with a pair of square brackets - '[]' app.get('/', function(req, res, next){ News. find(). exec(function(err, nws){ if(err) return next(err); res.send(nws); // res.render(nws); }); res.render('index', { title: 'static Express' }); }); app.get('/users', user.list); app.get('*', function(req, res){ res.render('index.html', {layout: null}) }) // development only if ('development' == app.get('env')) { app.use(express.errorHandler()); } http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); 

我非常感谢你的帮助。 问候,贾里德

您可能需要为“新闻”添加专门的路线:

 app.get('/news', function(req, res, next){ News. find(). exec(function(err, nws){ if(err) { res.writeHead(500, err.message) } else { res.send(nws); } }); }); 

现在,你已经得到它返回的网页的基础知识( res.render('index', { title: 'static Express' }); ),然后从find调用的响应。 Angular不会接受这个结果,这也解释了为什么你在响应中看到DOCTYPE。

然后从你的Angular代码中调用它:

 var News = $resource('/news');