1

我决定将我的项目放在 Restangular 中,但我在 SAVE 和 UPDATE 操作中遇到了一些问题。

我将 API restheart 与 mongodb 一起使用。

在 SAVE 中,我正在保存一个新帖子,当我偶然进行任何更改时,它会保存一个新帖子而不是更新它。

更新,我可以更新第一个实例,例如,更改标题并保存,如果我再次更新它会更新.. 生成此错误:

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;
        });
    };
4

1 回答 1

3

在 RESTHeart 中,POST 和 PUT 是 upsert 操作,即如果资源不存在则创建资源或更新资源。

这里的重点是_id:

  • 在 PUT 操作中,文档 id 由 URI /db/collection/id_of_document 给出(有关 URI 格式的更多信息在官方文档
  • 在 POST 操作中,可以在 json 有效负载中指定_id属性。如果未指定,则会创建一个新文档,并通过Location响应标头返回自动生成的_id(ObjectId 类型) 。如果指定了_id,则 POST 将导致更新,因为具有该_id的文档已经存在。

在您的情况下,在第一个 POST (创建文档)上,您需要使用创建的帖子资源的 URI 获取Location响应标头,并通过 GET 操作重新加载它;使用此数据(现在包含生成的_id)进一步 POST 将导致更新。

无论如何,当您对现有资源执行 POST、PATCH、PUT 或 DELETE 操作时,您需要通过If-Match请求标头传递 ETag。您可以在官方文档的ETag部分找到更多信息,包括 AngularJs 的示例。

此外,在 github 上有一个使用 RESTHeart、AngluarJs 和 Restangular 的 Web 应用程序的完整示例:restheart-notes-example

查看notes.js控制器,您将在其中找到创建、更新和删除文档的所有逻辑。

于 2015-09-10T07:40:07.130 回答