【发布时间】: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: