2015-07-23 4 views
0

У меня возникли проблемы с использованием Restangular для обновления существующего документа (products) в моей базе данных Mongodb с новым объектом reviews. Пока что я могу добавить обзор в интерфейсный центр без каких-либо проблем, но мне трудно опубликовать данные обзора в моей базе данных. В настоящее время, когда я отправляю новый review, мой код создает новый ключ в моей коллекции products, но не сохраняет информацию о просмотре. Как я могу нажать обзор на сервер? Пожалуйста, дайте мне знать, если мне нужно предоставить какие-либо дополнительные данные или разъяснения. Любая помощь будет оценена.Restangular POST a Mongoose Embedded Document

Пример JSON продукта

{"_id":"xxxxx","name":"Product 1","description":"Product 1 Description","price":"1299.99","createdOn":"143767117903", "reviews":[{}]} 

После добавления обзора это то, что мой JSON выход моего нового обзора

{"__v":0,"_id":"xxxxxx"} 

Это то, что я ожидал увидеть в мой выход JSON

{"__v":0,"_id":"xxxxxx","stars":4,"body":"Test review","author":"[email protected]","createdOn":143767117903} 

Детали проекта

Я использовал YEOMAN угловой генератор, так что я есть server и А client каталогов. Я использую MongoDB, MongooseJS, ExpressJS, AngularJS и NodeJS. Насколько я знаю, мои серверные маршруты для моих продуктов работают, так как я могу просматривать все продукты, добавлять продукт, просматривать продукт (включая любые обзоры, связанные с продуктом), и, по крайней мере, добавлять пустой обзор.

У меня есть схема products, которая включает в себя встроенный документ в схему reviews.

Продукты Схема

/** 
* Schema for Products 
*/ 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var productSchema = new Schema({ 
    name: { 
     type: String, 
     require: true, 
    }, 
    description: { 
     type: String, 
     require: true, 
    }, 
    shine: { 
     type: Number, 
     require: true, 
    }, 
    price: { 
     type: Number, 
     require: true, 
    }, 
    rarity: { 
     type: Number, 
     require: true, 
    }, 
    color: { 
     type: String, 
     require: true, 
    }, 
    faces: { 
     type: Number, 
     require: true, 
    }, 
    images: {}, 
    reviews: [{type: mongoose.Schema.Types.ObjectId, ref: 'Review'}], 
    createdOn: { 
     type: Date 
    } 
}); 
var Product = mongoose.model('Product', productSchema); 
module.exports = Product; 

Отзывы Схема

/** 
* Schema for Product Reviews 
*/ 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var reviewSchema = new Schema({ 
    stars: { 
     type: Number 
    }, 
    review: { 
     type: String 
    }, 
    author: { 
     type: String 
    }, 
    createdOn: { 
     type: Date 
    } 
}); 
var Review = mongoose.model('Review', reviewSchema); 
module.exports = Review; 

Продукция Отзывы Контроллер

(function() { 
    'use strict'; 
    /** 
    * @ngdoc function 
    * @name gemStoreApp.controller:ReviewCtrl 
    * @description 
    * # ReviewCtrl 
    * Controller of the gemStoreApp 
    */ 
    angular.module('gemStoreApp') 
     .controller("ReviewCtrl", ['$scope', 'Restangular', 'productsService', function ($scope, Restangular, productsService) { 
      this.review(); 

      this.addReview = function(product){ 
       this.review.createdOn = Date.now(); 

       var productReview = Restangular.all('/products/' + product._id + '/reviews'); 

       productReview.post(product).then(function(newResource){ 

       }); 
      }; 
})(); 

Продукция Сервис

(function() { 
    'use strict'; 
    /** 
    * @ngdoc service 
    * @name gemStoreApp.productService 
    * @description 
    * # productService 
    */ 
    angular.module('gemStoreApp.productService',['ngResource']) 
     .factory('productsService', function($resource) { 
      return $resource('/products/:id', {id:'@id'},{ 
       'update': { method: 'PUT'} 
      }); 
     }); 
    })(); 

ответ

1

Решения, которое было предоставлено сослуживцем, чтобы изменить маршруты сервера для моего продукта/обзоров маршрутизации.

обновленные продукты обзор контроллера

angular.module('gemStoreApp') 
    .controller('ReviewCtrl', ["$scope, ,'$resource', '$Restangular', 'productsService', function ($scope, $resource, Restangular, productsService) { 
     this.review = {}; 

     this.addReview = function(product){ 
      this.review.createdOn = Date.now(); 
      var productReview = Restangular.all('/products/' + product._id + '/reviews'); 
      var updatedProduct = product; 
      productReview.post(this.review).then(function(newResource){ 
       product.reviews.push(newResource); 
      }); 

      this.review = {}; 
     }; 
    }]); 

обновленные обзоры маршрут

... 
router.post('/:product/reviews', function (req, res, next) { 
    var time = moment().formated('MMMM Do YYYY, h:mm:ss a'); 
    var body = req.review; 

    var review = new Review(req.body); 
    review.product = req.product 

    review.save(function (err, review){ 
     if (err) {return next(err);} 

    req.product.reviews.push(review); 

    req.products.save(function (err, product) { 
     if (err) {return next(err);} 

     res.json(review); 
     res.status(201).json({ 
      'message': review.review + 'created' 
     }); 
    }); 
}); 
... 

Я также буду размещать прямую ссылку на файлы в моем проекте GitHub когда я совершаю свои изменения.