2013-10-23 50 views
4

不是放入标题的最简单问题。

总之,我的应用程序是建立在nodejs/expressjs并建立了对URL的API:

编辑:我使用的是当前的代码是:

$scope.updateProduct = $resource('/api/updateProduct/:product/:param/:value',{},{ 
    query: {method:'GET'}, 
    post: {method:'POST'}, 
    save: {method:'PUT', params: {brand: '@brand', param:'@param', value:'@value'}}, 
    remove: {method:'DELETE'} 
}); 
$scope.updateProduct.save({ 
    product : $scope.post._id, 
    param: 'likes', 
    value: $scope.user._id 
    }); 

目前它调用/api/updateProduct而不是/api/updateProduct/<product>/<param>/<value>,就像它应该/像我在执行$scope.updateProduct.get()时一样。

在我的控制台我认为(作为一个例子):

PUT /api/updateBrand/Quay%20Eyewear%20Australia/userTags/sunglasses,%20classic 200 30ms - 2.31kb 

然而,API不实际访问/没有任何反应。有趣的是,如果我在我的浏览器中访问localhost:5000/api/updateBrand/Quay%20Eyewear%20Australia/userTags/sunglasses,%20classic,它会发布正确的数据并在我的数据库中更新产品,所以这肯定是调用$resource的错误。

回答

2

正如你可以看到ngResource docs$resource接受3个参数:

$resource(url[, paramDefaults][, actions]);

你是通过你的行动作为参数。

正确的版本是:

$scope.updateProduct = $resource('/api/updateProduct/:product/:param/:value',{}, {'save':{method:'POST'}}); 

注意,它甚至不是必要的,因为当你使用$resource你已经创建默认的方法:

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

有趣,谢谢。我摆脱了资源调用中的附加参数,所以它只是$ resource('/ api/updateProduct /:product /:param /:value')。然而,当我执行$ scope.updateProduct.save()时,它会进入POST/api/updateBrand 200 34ms - 2.31kb而不是POST/api/updateBrand/productname/paramater/value 200 34ms - 2.31kb,后端没有任何反应。有任何想法吗? – Jascination

+0

您应该保存参数,方法与粘贴您的问题相同:'$ scope.updateProduct.save({0} {0} {scope.post._id, param:'likes', value :$ scope.user._id });' – Beterraba

+0

我已经这样做了,我会更新上面的问题来澄清一点。 – Jascination

0

首先,你的已经定义了save()有一个名为“品牌”的参数,但在您的网址模板中,并且在save()的调用中,您正在使用“产品”。我猜这是一个错字。

你说当你使用浏览器访问网址时,它运行良好;但是当angular向同一个url发出PUT请求时,什么也没有发生。这表明您的后端被配置为仅处理此特定url模式的GET请求。因此,您需要确保您的后端正在接受PUT请求。

0

我一直在努力解决这个问题,并且能够通过下面的等价调用将参数传递给资源(在'save'之前注意'$')。

$scope.updateProduct.$save({ 
    product : $scope.post._id, 
    param: 'likes', 
    value: $scope.user._id 
}); 

我也没有在资源中定义'save'方法。根据Angular docs

“调用这些方法(意味着非GET方法)使用给定的方法,params和headers在url模板上调用$ http当数据从服务器返回时,该对象是资源类型和所有非GET方法都可以使用$ prefix,这使您可以轻松地在服务器端数据上支持CRUD操作(创建,读取,更新,删除)。“