我决定把我的项目放在Restangular中,但是我在SAVE和UPDATE操作中遇到了一些问题。
我将API restheart与mongodb一起使用。
在我的案例中保存,我正在保存一个新帖子,当我偶然做出任何更改时,它会保存一个新帖子而不是更新它。
UPDATE on,我可以更新第一个实例,例如,更改标题并保存,如果我再次更新它会更新..生成此错误:
PUT http://127.0.0.1:8080/api/portfolio/55ef4b15ef862e8f7316cbf1 412(先决条件失败) 关注我的资源和代码:
Restangular.all($scope.section).getList($scope.query).then(function(res){
$scope.items = res;
});
我的保存:
// create new object item
$scope.item = Restangular.one($scope.section);
// save object
$scope.addItem = function(){
$scope.item.save().then(function(){
toast.msgToast($scope.section + ' ...item criado!');
}, function(err){
toast.msgToast($scope.section + ' ...ocorreu um erro ao criar o item!');
});
};
我的更新:
$scope.updateItem = function(){
$scope.item.save().then(function(){
toast.msgToast($scope.section+ ' #' +$scope.item._id.$oid+ ' ....Atualizado!');
});
};
$scope.loadItem = function(){
Restangular.one($scope.section, $stateParams.id).get().then(function(item) {
$scope.item = item;
});
};
答案 0 :(得分:3)
在RESTHeart中,POST和PUT是upsert操作,即如果资源不存在或更新资源,它们会创建资源。
这里的重点是关于_id:
在您的情况下,在第一次POST(创建文档)时,您需要获取带有创建的post资源的URI的 Location 响应头,并通过GET操作重新加载它;使用此数据进一步POST(现在包含生成的 _id )将导致更新。
在任何情况下,当您在现有资源上执行POST,PATCH,PUT或DELETE操作时,您需要通过 If-Match 请求标头传递ETag。您可以在官方文档的ETag部分找到更多信息,包括AngularJs的示例。
此外,还有一个完整的示例,表示在github上使用RESTHeart,AngluarJs和Restangular的Web应用程序:restheart-notes-example。
查看notes.js控制器,您可以在其中找到创建,更新和删除文档的所有逻辑。