【问题标题】:REST Routes with mongoose and express带有 mongoose 和 express 的 REST 路由
【发布时间】:2015-10-04 12:53:42
【问题描述】:

当我尝试从前端向我的产品添加评论时,我收到 PUT http://localhost:3000/products 的 404 错误。但我将使用我的路由使用以下 curl 命令添加/更新数据:

curl --data "name=Product 1&description=Product 1 Description&shine=10&price=29.95&rarity=200&color=blue&faces=3" http://localhost:3000/products

我的产品路由器

// This handles retrieving of products
// Includes Express
var express = require('express');
// Initialize the router
var router = express.Router();
var moment = require('moment');
var _ = require('underscore');
var color = require('cli-color');
var mongoose = require('mongoose');
var Product = mongoose.model('Product');
var Review = mongoose.model('Review');
// Route middleware
router.use(function(req, res, next) {
    console.log("Something is happening in products!!");
    next();
});
// GET route for all Products
    router.get('/', function (req, res, next) {
        Product.find( function (err, products) {
            if (err) {
                return next(err);
            }
            res.json(products);
        });
});
// POST route for adding a Product
router.post('/', function (req, res, next) {
    var product = new Product (req.body);
    product.save( function (err, post) {
        if(err) {
            return next(err);
        }
        res.json(product);
    });
});
// Pre-loading product object
router.param('product', function (req, res, next, id) {
    var query = Product.findById(id);
    query.exec( function (err, product) {
        if (err) {
            return next(err);
        }
        if(!product) {
            return next(new Error('can\'t find product'));
        }
        req.product = product;
        return next();
    })
});
// GET route for retrieving a single product
router.get('/:product', function (req, res) {
    req.product.populate('reviews', function (err, product) {
        if (err) {
            return next(err);
            }
        res.json(req.product);
    });
});
// POST route for creating a review
router.post('/:product:reviews', function (req, res, next) {
    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.product.save( function (err, review) {
            if (err) {
                return next(err);
            }
            res.json(review);
        });
    });
});

此代码取自 [MEAN stackl2 的 thinkster 教程

原帖

我无法弄清楚如何使用我在 Angular 应用程序中使用 ngResource 定义的服务来更新我的 mongodb 数据库中的现有条目。到目前为止,我无法创建一个在用户单击我的提交按钮后更新后端的函数。我一直在寻找解决方案大约 2 天,但到目前为止还没有找到解决方案。我知道该解决方案类似于我在 My User's Controller 中删除用户的方式,但我尝试过的任何方法都没有奏效。

我的产品服务

angular.module('gemStoreApp.productService',['ngResource'])
    .factory('productsService', function($resource) {
        return $resource('/products/:id', {},{
            'update': { method: 'PUT'}
        });
    });

我的产品详情

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

            productService.save({id: product._id}, function() {
                // I have tried .update, .$update, and .save methods 
            });

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

我已验证 products.review 变量包含更新。以下是我在添加评论之前和之后从控制台输出的 JSON 示例:

评论添加到前端之前

{"_id":"product_id","name":"Product 1","description":"Product 1 Description",...,"reviews":[{}]}

评论添加到前端后

{"_id":"product_id","name":"Product 1","description":"Product 1 Description",...,"reviews":[{"stars":4,"body":"An Awesome review!","author":"user@domain.com","createdOn":1436963056994}]}

而且我知道我的 productsService.save() 函数也被调用了,因为我可以将控制台登录并在浏览器中查看时看到它运行。

我的用户的控制器

angular.module('gemStoreApp')
    .controller('UsersCtrl', ['$scope', '$http', 'usersService', function ($scope, $http, usersService) {
        $scope.users = {};
        $scope.users = usersService.query();
        $scope.remove = function(id) {
            var user = $scope.users[id];
            usersService.remove({id: user._id}, function() {
                $scope.users.splice(user, 1);
            });
        };
    }]);

我的完整源代码可在我的Github 页面上找到。任何帮助将不胜感激。

【问题讨论】:

  • 产品对象来自哪里?
  • 我假设您问我如何从我的数据库中获取我的产品对象?我正在使用 mongoose 和 express 连接到我的数据库。如果它有助于我的项目是基于 Angular 和 Express 应用程序的教程。并且位于:start.jcolemorrison.com/…
  • 不,只是误读了,无论如何(在哪里?)你如何调用你的函数 addReview ?关键是您应该执行 product.$update 而不是 service.save()。但这只有在您的 var "product" 来自 $resource 服务时才有效。
  • 我在表单的 ng-submit 上调用 addReview 函数。这是我的 html 的 sn-p:

标签: mongodb express mongoose


【解决方案1】:

我其实是在这个plunker中投入工作的

拿了同一家工厂:

app.factory('productsService', function($resource) {
    return $resource('product/:id', {id:"@id"},{
        'update': { method: 'PUT'}
    });
});

这是我的控制器:

$scope.products = productsService.query();
$scope.saveProduct = function(product){
  product.$update();
}

以及我如何在 HTML 中传递值:

<div ng-repeat="product in products">
  <input type="text" ng-model="product.text"> 
  <button ng-click="saveProduct(product)">Update</button>
</div>

如果您在 javascript 控制台中跟踪网络请求,您将看到一个请求:PUT /product/id 和更新的数据。

希望它有所帮助。如果您还有任何问题,请随时提问。

【讨论】:

  • 我仍然遇到问题,但现在我认为问题出在服务器端的路由上。我收到 404 错误。我将使用路线中的代码更新我的操作。
  • @HerrJosua 然后您应该使用适当的标签重新发布。我不确定你会对只有角度标签的服务器部分有任何帮助:)
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 2020-10-09
  • 2016-05-22
  • 2014-09-15
  • 2016-05-09
  • 2018-04-01
  • 2020-11-30
相关资源
最近更新 更多