Прежде всего, я должен сказать, что я новичок в технологии угловых и узловых. Так жаль мое невежество.Ошибка копирования свойств req.body в Mongoose Model
Я получаю эту ошибку, когда пытаюсь сохранить объект Entity from edition: «Cast to ObjectId failed for value» [object Object] «at path» category «'.
Ну, у меня есть этот код:
HTML:
<form class="form-horizontal" data-ng-submit="update()" novalidate>
<fieldset>
<div class="form-group">
<label for="listaCat">Categoría:</label>
<select id="listaCat" class="form-control" data-ng-Fmodel="notification.category" data-ng-options="c.name for c in listaCategorias track by c._id">
</select>
</div>
<div class="form-group">
<label class="control-label" for="name">Descripción</label>
<div class="controls">
<input type="text" data-ng-model="notification.name" id="name" class="form-control" placeholder="Descripción" required>
</div>
</div>
<div class="form-group">
<input type="submit" value="Guardar" class="btn btn-default">
</div>
<div data-ng-show="error" class="text-danger">
<strong data-ng-bind="error"></strong>
</div>
</fieldset>
</form>`
Угловая контроллер:
$scope.update = function() {
var notification = $scope.notification;
notification.$update(function() {
$location.path('notifications/' + notification._id);
}, function(errorResponse) {
$scope.error = errorResponse.data.message;
});
};
стороны сервера управление:
var mongoose = require('mongoose'),
errorHandler = require('./errors.server.controller'),
Notification = mongoose.model('Notification'),
_ = require('lodash');
exports.update = function(req, res) {
var notification = req.notification;
notification = _.extend(notification , req.body);
notification.save(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.jsonp(notification);
}
});
};
Mongoose Модель:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var NotificationSchema = new Schema({
name: {
type: String,
default: '',
required: 'Rellena la notificación',
trim: true
},
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
category: {
type: Schema.ObjectId,
ref: 'Category'
}
});
mongoose.model('Notification', NotificationSchema);
var CategorySchema = new Schema({
name: {
type: String,
default: '',
required: 'Rellena la categoría',
trim: true
},
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
mongoose.model('Category', CategorySchema);
Так что, если я отладка внутри контроллера сервера на методе обновления с WebStorm, я могу видеть, что req.body приходит с каждым атрибутом хорошо сформированы, но после того, как новообращенный REQ. тело в Notification Mongoose Модель с:
notification = _.extend(notification , req.body);
атрибут категория не является модель но ObjectId. Кажется, что lodash.extend не работает должным образом для сложных атрибутов. Я пробовал много других способов клонирования объекта, но безуспешно.
Наконец я решил его с этой линией внутри углового регулятора:
notification.category = $scope.notification.category._id;
notification.$update(function() {
Во всяком случае, я думаю, что это не правильный путь. Я предполагаю, что должен быть способ копирования свойств req.body в модель mongoose, не делая этого вручную для сложных свойств.
Большое спасибо!