Restrict POST - встроенный документ Mongoose

0

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

Образец 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'}
            });
        });
    })(); 
Теги:
restangular

1 ответ

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'
         });
    });
});
...

Я также отправлю прямой URL-адрес файлам моего проекта GitHub после выполнения моих изменений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню