不是最简单的问题。
无论如何,我的应用程序构建在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
的方式肯定是错误的。
答案 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操作(创建,读取,更新,删除)。“