使用method:POST时,AngularJS $资源调用错误的API URL

时间:2013-10-23 11:15:37

标签: javascript node.js api angularjs angular-resource

不是最简单的问题。

无论如何,我的应用程序构建在nodejs / expressjs上,并为网址设置了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的方式肯定是错误的。

3 个答案:

答案 0 :(得分:3)

正如您在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'} 
};

答案 1 :(得分:0)

首先,您已将save()定义为名为“品牌”的参数,但在您的网址模板和save()调用中,您使用的是“产品”。我想这是一个错字。

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

答案 2 :(得分:0)

我正在努力解决这个问题,并且可以通过执行下面的等效调用将参数传递给资源(在'save'之前注意'$')。

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

我也没有在资源中定义'save'方法。根据{{​​3}}:

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