私はオンラインコースアプリケーションを開発しています。コースが作成されると、特定のコースの新しいビデオ講義を追加しようとしています。コースが作成された後は、新しいコースを追加しようとすると、今まで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>
コースオブジェクトのダンプを 'req.body'から新しい値を入力する前と後に投稿できますか? – nainy
"req.body.courseLecture.lecture_video"のconsole.logを実行すると、定義されません。 @nainy –
これはおそらく、データがモデルに到達していないことを意味します。 Mongoは、正しく読み返すと、 'undefined 'の値を無視できると解釈し、データは消去されずに更新もされません。 req.bodyからモデルを作成した部分をコメントアウトし、データベース内のものとは異なるものをハードコードして保存してから、モデルがmongoで変更されたかどうかを調べます。 – nainy