Angularjs 平均堆栈,MongoDB记录创建不工作

Angularjs 平均堆栈,MongoDB记录创建不工作,angularjs,mongodb,express,mongoose,mean,Angularjs,Mongodb,Express,Mongoose,Mean,我正在开发一个平均堆栈应用程序。我试图简单地从表单在MongoDB中创建一个记录。我已经在调试器中验证了视图和控制器之间的数据绑定是否正常工作。在服务器端控制器代码中,在尝试保存记录之前检查req.body将返回“undefined”(见下面的代码)。在Angular controller中,我在执行announcement.$save函数时检查了回调中的“results”值,它显示了要填充的标题和详细信息值。但是,数据没有持久化到数据库,我得到以下错误: { [ValidationError:

我正在开发一个平均堆栈应用程序。我试图简单地从表单在MongoDB中创建一个记录。我已经在调试器中验证了视图和控制器之间的数据绑定是否正常工作。在服务器端控制器代码中,在尝试保存记录之前检查req.body将返回“undefined”(见下面的代码)。在Angular controller中,我在执行announcement.$save函数时检查了回调中的“results”值,它显示了要填充的标题和详细信息值。但是,数据没有持久化到数据库,我得到以下错误:

{ [ValidationError: Announcement validation failed]
  message: 'Announcement validation failed',
  name: 'ValidationError',
  errors:
   { details:
      { [ValidatorError: Path `details` is required.]
        properties: [Object],
        message: 'Path `details` is required.',
        name: 'ValidatorError',
        kind: 'required',
        path: 'details',
        value: undefined },
     heading:
      { [ValidatorError: Path `heading` is required.]
        properties: [Object],
        message: 'Path `heading` is required.',
        name: 'ValidatorError',
        kind: 'required',
        path: 'heading',
        value: undefined } } }
我错过了什么?这是我的密码:

我的html文件中的表单:

  <form ng-submit="AnnouncementsVm.createAnnouncement()">
    <fieldset class="form-group">
      <label for="heading">Heading:</label>
      <textarea class="form-control" id="heading" rows="1"
        ng-model="AnnouncementsVm.announcementHeading"></textarea>
    </fieldset>
    <fieldset class="form-group">
      <label for="details">Details:</label>
      <textarea class="form-control" id="details" rows="3"
        ng-model="AnnouncementsVm.announcementDetails"></textarea>
    </fieldset>

    <p><input type="submit" value="Submit →"><p>
  </form>
这是我的控制器代码:

angular.module('app').
  controller('Announcements.Controller', AnnouncementsCtrl);

function AnnouncementsCtrl($log, $resource) {
  $log.debug('Executing AnnouncementsCtrl');
  var vm = this;
  var Announcement = $resource('/api/announcements');

  Announcement.query( function(results) {
    vm.announcements = results;
  });

  vm.announcements = [];

  vm.createAnnouncement = function() {
    var announcement = new Announcement({
      heading: vm.announcementHeading,
      details: vm.announcementDetails
    });
    announcement.$save( function(result) {
      vm.announcements.push(result);
      vm.announcementHeading = '';
      vm.announcementDetails = '';
    });
  };
}
REST API路由定义为:

  $routeProvider.
    when('/announcements', {
      templateUrl: '/views/partials/announcements.html',
      controller: 'Announcements.Controller',
      controllerAs: 'AnnouncementsVm'
    });
app.post('/api/announcements', announcementsController.create);
服务器端控制器(announcements controller.js):

最后,我使用这个Mongoose模型(Announcements.js)


您的路线是如何配置的?您是否将控制器作为“公告SVM”传递

您是否尝试从控制器访问ng models announcementHeading和announcementDetails的值

试着把

vm.createAnnouncement = function() {
 $log.log(vm.announcementHeading);
 $log.log(vm.announcementDetails);

});

};

并检查您是否获得了正确的值

如何配置角度布线?您是否将控制器作为“公告SVM”传递

您是否尝试从控制器访问ng models announcementHeading和announcementDetails的值

试着把

vm.createAnnouncement = function() {
 $log.log(vm.announcementHeading);
 $log.log(vm.announcementDetails);

});

};

并检查您是否得到正确的值,问题是否已解决。我没有集成路由的主体解析器,因此请求没有正确填充。以下是更新后的ExpressJS路线:

'use strict';

var bodyParser = require('body-parser');
var path = require('path');
var announcementsController = require('../controllers/announcements-controller.js');

module.exports = function(app) {

  // create application/json parser
  var jsonParser = bodyParser.json();

  // create application/x-www-form-urlencoded parser
  var urlencodedParser = bodyParser.urlencoded({ extended: false });

  app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname, '../../client/views/index.html'));
  });

  // REST API
  app.get('/api/announcements', announcementsController.list);
  app.post('/api/announcements', jsonParser, announcementsController.create);
};

问题解决了。我没有集成路由的主体解析器,因此请求没有正确填充。以下是更新后的ExpressJS路线:

'use strict';

var bodyParser = require('body-parser');
var path = require('path');
var announcementsController = require('../controllers/announcements-controller.js');

module.exports = function(app) {

  // create application/json parser
  var jsonParser = bodyParser.json();

  // create application/x-www-form-urlencoded parser
  var urlencodedParser = bodyParser.urlencoded({ extended: false });

  app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname, '../../client/views/index.html'));
  });

  // REST API
  app.get('/api/announcements', announcementsController.list);
  app.post('/api/announcements', jsonParser, announcementsController.create);
};

路由的定义如下:`when('/announcements',{templateUrl:'/views/partials/announcements.html',controller:'announcements.controller',controllerAs:'AnnouncementsVm'})。'我在调试器中检查了vm.announcementHeading和vm.announcementDetails的值,并得到了预期的值。我使用$logroute得到同样的结果路由定义如下:`when('/announcements',{templateUrl:'/views/partials/announcements.html',controller:'announcements.controller',controllerAs:'AnnouncementsVm'})'我在调试器中检查了vm.announcementHeading和vm.announcementDetails的值,得到了我期望的值。我使用$log得到同样的结果