2017-02-04 9 views
1

私はオンラインコースアプリケーションを開発しています。コースが作成されると、特定のコースの新しいビデオ講義を追加しようとしています。コースが作成された後は、新しいコースを追加しようとすると、今までMongoDBにはなかった新しいビデオ講義を追加していても、更新要求が送信されます。ここに私のマングーススキーマがあります。ファイル名: - course.server.model.js。node.jsからmongodbのドキュメントを更新できません

'use strict'; 
/** 
    * Module dependencies 
    */ 
var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

/** 
    * Course Schema 
    */ 
var CourseSchema = new Schema({ 
    created: { 
     type: Date, 
     default: Date.now 
    }, 
    title: { 
     type: String, 
     default: '', 
     trim: true, 
     required: 'Title cannot be blank' 
    }, 
    content: { 
     type: String, 
     default: '', 
     trim: true 
    }, 
    // courseLecture: [String], 
    courseLecture: [{ 
     lecture_title: { 
      type: String 
     }, 
     // week_number: { type: Number }, 
     lecture_video: [String], 
     pdf_files: [String] 
     // lecture_video: [{ videoUrl: String }] 
    }], 
    /* 
    courseLecture: { 
    type: String, 
    default: '', 
    trim: true 
    },*/ 
    user: { 
     type: Schema.ObjectId, 
     ref: 'User' 
    } 
}); 

mongoose.model('Course', CourseSchema); 

私のnode.jsコントローラーがコースを更新します。ファイル名: - courses.server.controller.js

'use strict'; 

/** 
    * Module dependencies 
    */ 
var path = require('path'), 
    mongoose = require('mongoose'), 
    Course = mongoose.model('Course'), 
    errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')); 

/** 
    * Create an course 
    */ 
exports.create = function(req, res) { 
    var course = new Course(req.body); 
    course.user = req.user; 

    course.save(function(err) { 
     if (err) { 
      return res.status(422).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(course); 
     } 
    }); 
}; 

/** 
    * Show the current course 
    */ 
exports.read = function(req, res) { 
    // convert mongoose document to JSON 
    var course = req.course ? req.course.toJSON() : {}; 

    // Add a custom field to the Course, for determining if the current User is the "owner". 
    // NOTE: This field is NOT persisted to the database, since it doesn't exist in the Course model. 
    course.isCurrentUserOwner = !!(req.user && course.user && course.user._id.toString() === req.user._id.toString()); 

    console.log('course value is: ' + course); 
    console.log('video lecture embed value is: ' + course.courseLecture.lecture_video); 

    res.json(course); 
}; 

/** 
    * Update an course 
    */ 
exports.update = function(req, res) { 
    var course = req.course; 

    course.title = req.body.title; 
    course.content = req.body.content; 
    course.courseLecture.lecture_video = req.body.courseLecture.lecture_video; 
    course.courseLecture.lecture_title = req.body.courseLecture.lecture_title; 
    course.courseLecture.pdf_files = req.body.courseLecture.pdf_files; 
    console.log('course lecture video url is: ' + req.body.courseLecture.lecture_video); 
    course.save(function(err) { 
     if (err) { 
      return res.status(422).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(course); 
     } 
    }); 
}; 

/** 
    * Delete an course 
    */ 
exports.delete = function(req, res) { 
    var course = req.course; 

    course.remove(function(err) { 
     if (err) { 
      return res.status(422).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(course); 
     } 
    }); 
}; 

/** 
    * List of Courses 
    */ 
exports.list = function(req, res) { 
    Course.find().sort('-created').populate('user', 'displayName').exec(function(err, courses) { 
     if (err) { 
      return res.status(422).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(courses); 
     } 
    }); 
}; 

/** 
    * Course middleware 
    */ 
exports.courseByID = function(req, res, next, id) { 

    if (!mongoose.Types.ObjectId.isValid(id)) { 
     return res.status(400).send({ 
      message: 'Course is invalid' 
     }); 
    } 

    Course.findById(id).populate('user', 'displayName').exec(function(err, course) { 
     if (err) { 
      return next(err); 
     } else if (!course) { 
      return res.status(404).send({ 
       message: 'No course with that identifier has been found' 
      }); 
     } 
     req.course = course; 
     next(); 
    }); 
}; 

は、興味深いことに、私は2つのフィールドは、タイトルや内容、すなわち更新することが可能です、しかし、私は更新したりすることはできませんよという、courseLecture配列の内側に何でもあり新しいセーブをする。 ここで間違っているところを教えてください。

フロントエンドの作業をより明確にするために、角度コントローラーとHTMLファイルコードを追加します。 角度コントローラ。ファイル名: - course.client.controller.js

(function() { 
'use strict'; 

angular 
.module('courses.admin') 
.controller('CoursesAdminController', CoursesAdminController); 

CoursesAdminController.$inject = ['$scope', '$state', '$window', 'courseResolve', 'Authentication', 'Notification']; 

function CoursesAdminController($scope, $state, $window, course, Authentication, Notification) { 
var vm = this; 

vm.course = course; 
vm.authentication = Authentication; 
vm.form = {}; 
vm.remove = remove; 
vm.save = save; 
vm.ShowHide = ShowHide; 
vm.addNewChoice = addNewChoice; 

$scope.IsVisible = false; 
function ShowHide() { 
    // If DIV is visible it will be hidden and vice versa. 
    $scope.IsVisible = $scope.IsVisible ? false : true; 
} 

function addNewChoice() { 
    $scope.vm.course.courseLecture.push(''); 
} 

// Remove existing Course 
function remove() { 
    if ($window.confirm('Are you sure you want to delete?')) { 
    vm.course.$remove(function() { 
     $state.go('admin.courses.list'); 
     Notification.success({ message: '<i class="glyphicon glyphicon-ok"></i> Course deleted successfully!' }); 
    }); 
    } 
} 

// Save Course 
function save(isValid) { 
    if (!isValid) { 
    $scope.$broadcast('show-errors-check-validity', 'vm.form.courseForm'); 
    return false; 
    } 

    // Create a new course, or update the current instance 
    vm.course.createOrUpdate() 
    .then(successCallback) 
    .catch(errorCallback); 

    function successCallback(res) { 
    $state.go('admin.courses.list'); // should we send the User to the list or the updated Course's view? 
    Notification.success({ message: '<i class="glyphicon glyphicon-ok"></i> Course saved successfully!' }); 
    } 

    function errorCallback(res) { 
    Notification.error({ message: res.data.message, title: '<i class="glyphicon glyphicon-remove"></i> Course save error!' }); 
    } 
} 
} 
}()); 

自分のHTMLファイル。ファイル名: - フォーム - course.client.view.html

<section> 
<div class="page-header"> 
    <h1>{{vm.course._id ? 'Edit Course' : 'New Course'}}</h1> 
</div> 
<div class="pull-right"> 
    <a ng-show="vm.course._id" class="btn btn-primary" ng-click="vm.remove()"> 
    <i class="glyphicon glyphicon-trash"></i> 
    </a> 
</div> 
<div class="col-md-12"> 
    <form name="vm.form.courseForm" class="form-horizontal" ng-submit="vm.save(vm.form.courseForm.$valid)" novalidate> 
    <fieldset> 
     <div class="form-group" show-errors> 
      <label class="control-label" for="title">Title</label> 
      <input name="title" type="text" ng-model="vm.course.title" id="title" class="form-control" placeholder="Title" required autofocus> 
      <div ng-messages="vm.form.courseForm.title.$error" role="alert"> 
       <p class="help-block error-text" ng-message="required">Course title is required.</p> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="control-label" for="content">Content</label> 
      <textarea name="content" data-ng-model="vm.course.content" id="content" class="form-control" cols="30" rows="10" placeholder="Content"></textarea> 
     </div> 
     <!-- <a class="btn btn-primary pull-right" data-ui-sref="admin.courses.createLecture"> --> 
     <div> 
      <a class="btn btn-primary pull-right" ng-click="vm.ShowHide()"> 
      <i class="glyphicon glyphicon-plus"></i> 
      </a><br> 
      <div ng-show="IsVisible"> 
       <div class="page-header"> 
       <h1>{{vm.course._id ? 'Edit Lecture' : 'New Lecture'}}</h1> 
       </div> 
       <div class="pull-right"> 
       <a ng-show="vm.course._id" class="btn btn-primary" ng-click="vm.remove()"> 
       <i class="glyphicon glyphicon-trash"></i> 
       </a> 
       </div> 
       <div class="col-md-12"> 
    <form name="vm.form.courseForm" class="form-horizontal" ng-submit="vm.save(vm.form.courseForm.$valid)" novalidate> 
    <fieldset data-ng-repeat="field in vm.course.courseLecture track by $index"> 
    <div class="form-group" show-errors> 
    <label class="control-label" for="LectureTitle">Lecture Title</label> 
    <input name="courseLecture" type="text" ng-model="vm.course.courseLecture.lecture_title[$index]" id="LectureTitle" class="form-control" placeholder="Lecture Title" required autofocus> 
    <div ng-messages="vm.form.courseForm.title.$error" role="alert"> 
    <p class="help-block error-text" ng-message="required">Lecture name is required.</p> 
    </div> 
    </div> 
    <div class="form-group"> 
    <label class="control-label" for="courseLecture">Add Lecture video url here</label> 
    <input name="courseLecture" type="text" ng-model="vm.course.courseLecture.lecture_video[$index]" id="courseLecture" class="form-control" placeholder="course Lecture"> 
    </div> 
    </fieldset> 
    <input type="button" class="btn btn-default" ng-click="vm.addNewChoice()" value="Add another URL"> 
    </form> 
    </div> 
    </div> 
    </div> 
    <div class="form-group"> 
    <button type="submit" class="btn btn-default">{{vm.course._id ? 'Update' : 'Create'}}</button> 
    </div> 
    </fieldset> 
    </form> 
</div> 
</section> 
+0

コースオブジェクトのダンプを 'req.body'から新しい値を入力する前と後に投稿できますか? – nainy

+0

"req.body.courseLecture.lecture_video"のconsole.logを実行すると、定義されません。 @nainy –

+0

これはおそらく、データがモデルに到達していないことを意味します。 Mongoは、正しく読み返すと、 'undefined 'の値を無視できると解釈し、データは消去されずに更新もされません。 req.bodyからモデルを作成した部分をコメントアウトし、データベース内のものとは異なるものをハードコードして保存してから、モデルがmongoで変更されたかどうかを調べます。 – nainy

答えて

0
exports.update = function(req, res) { 
var course = req.course; 

あなたreq.courseはMongoDBのオブジェクトではありません。もしあなたのデータは、現在のように見える場合マングース http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

+0

これを修正するにはどうすればいいですか興味深いことに、タイトルとコンテンツの2つのフィールドを更新することはできますが、courseLecture配列内には何も更新したり保存したりできません。 –

0

のfindOneAndUpdateメソッドを使用することができます。

{ 
    courseLecture: { 
    lecture_title: 'Test', 
    lecture_video: ['vid1', 'vid2'], 
    pdf_files: ['pdf1', 'pdf2'] 
    } 
} 

私はあなたが何をする必要があるかと思いますが、このビットを変更です:

courseLecture: [{ 
    lecture_title: { 
     type: String 
    }, 
    // week_number: { type: Number }, 
    lecture_video: [String], 
    pdf_files: [String] 
    // lecture_video: [{ videoUrl: String }] 
}] 

これまで:

courseLecture: { 
    lecture_title: { 
     type: String 
    }, 
    lecture_video: {type: [String] }, 
    pdf_files: {type: [String] } 
} 

最初にスキーマをh 'courseLecture'フィールドにオブジェクトの配列を保存するため、保存中に検証が成功しないか、またはスキーマがsetの操作を実行しない場合もあります。

+0

これを行うと、フロントエンドコードが破損して失敗します。 @nainy –

+0

モデルに渡すデータの例を本文に投稿できますか?あなたのコードから推測しようとしていますが、おそらく私はここで間違っています。 – nainy

+0

courseLecture:{ lecture_title:{ "試験タイトル"}、 lecture_video:[ "test_video"]、 PDF_Filesの:[ "testpdf"] } –

関連する問題