2014-12-30 3 views
0

Прежде всего, я должен сказать, что я новичок в технологии угловых и узловых. Так жаль мое невежество.Ошибка копирования свойств 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, не делая этого вручную для сложных свойств.

Большое спасибо!

ответ

0

Поскольку вы работаете над AngularJS и ExpressJS, я предлагаю вам использовать службу $resource, которая предназначена для взаимодействия с остальным API.

**$resource** содержит эти стандартный набор действий:

{ 'get': {method:'GET'}, 
    'save': {method:'POST'}, 
    'query': {method:'GET', isArray:true}, 
    'remove': {method:'DELETE'}, 
    'delete': {method:'DELETE'} }; 

Существует хорошая документация в ссылке, которую я разделяемой выше.

В вашем случае: Я предполагаю, что http://localhost:300/notifications/:id, это может быть ваш URL-адрес для отдыха, где вы хотите выполнить обновление.

Вы можете создавать свои собственные услуги, такие как:

var module = angular.module('myapp.services',['ngResource']); 

module.factory('MyAppUpdateService',function($resource){ 
    return $resource('notifications/:id', 
    { 
     id: '@id' 
    }, 
    { 
     'update': { method:'PUT' } 
    } 
); 
}); 

Теперь внутри углового контроллера приложения вы можете внедрить эту услугу, как зависимость и, следовательно, он будет доступен для выполнения обновления в этом REST URL.

angular.module('myapp',['ngResource','myapp.services']); 
angular.module('myapp').controller('MeetupsController',['$scope','$resource','$state','$location','MeetupUpdateService','socket', 
                  function($scope,$resource,$state,$location, MyAppUpdateService){ 

$scope.updateMeetup = function(){ 
       $scope.updateService = new MyAppUpdateService(); 
       $scope.updateService.name = $scope.notification.name; 
       . 
       . 
       . 
$scope.updateService.$update({id:$scope.notification.category._id},function(result){ 
        $location.path("/meetup/") 
       }); 
      } 

})]); 

Так что это был всего лишь пример, если вы хотите более полную реализацию. Посмотрите here, я создаю собственное MEAN-семя, и я делаю то же самое. Любые сомнения, пожалуйста, спросите.

Смежные вопросы