【问题标题】:AngularJS ngResource delete event not calling callbackAngularJS ngResource 删除事件不调用回调
【发布时间】:2016-04-04 13:13:39
【问题描述】:

我有这个代码:

dogsResource.delete({id: $stateParams.dogId}, angular.noop,
        function(value, responseHeaders){
            //Success
            console.log(value);
            console.log(responseHeaders);
        },
        function(httpResponse){
            //Error
            console.log(httpResponse);
        }
    );

删除完成,问题是既没有调用成功也没有调用错误。我也尝试过使用实例(也就是说,使用 $delete),但它也没有工作。

我尝试使用其他方法测试回调,例如 get

$scope.dog = dogsResource.get({id: $stateParams.dogId}, function(value, res){
    console.log(value);
});

而且它有效。我不知道为什么会这样,因为这只狗正在从数据库中删除。

谢谢

更新

dog资源代码

// Return the dogs resource
.factory('dogsResource', ['$resource', function($resource){
    return $resource("http://localhost:5000/dogs/:id",{id: "@id"},{update: {method: "PUT"}});
}])

更新 2

我发现了错误。它在 RESTful API(Node js)中。该方法没有向 Angular 发送任何内容,因此没有触发回调:

//DELETE - Delete a dog with specified ID
exports.deleteDog = function(req, res) {
    console.log('DELETE' + req.params.id);

    Dog.findById(req.params.id, function(err, dog) {
        dog.remove(function(err) {
            if(err) return res.status(500).send(err.message);
            console.log('Succesfully deleted.');
            res.status(200);
        })
    });
};

res.status(200) 替换为res.status(200).end() 触发了回调。

感谢大家的宝贵时间。

【问题讨论】:

  • 我知道这听起来很明显,但 angular.noop 应该存在吗?
  • @camden_kid 文档说非 http get 操作应该有一个 postData,我不需要那个。顺便说一句,我也尝试过使用 null、{} 甚至忽略它。
  • 是的,根据stackoverflow.com/questions/16579201/…,你是对的。控制台有错误吗?
  • 无,如我所说,删除完成,但不打印日志。
  • 你试过使用 promise 属性吗?像这样dogsResource.delete({id: $stateParams.dogId}).$promise.then(function(value) { console.log('value', value)});

标签: angularjs node.js ionic


【解决方案1】:

我建议你不要使用

res.status(200).end()

实际上,通常当您在 expressJS 中使用 REST 服务删除对象时,常见的情况是发送已删除的对象作为响应,因为前端获取该对象可能很有用(并确保它是好对象)。

所以不要使用

res.status(200).end()

使用

res.send(狗)

或者如果你想发送一个空响应,删除操作的状态码应该是:

res.status(204).end()

204 无内容

注意,不需要设置状态码,默认为200,所以设置状态码为200是没有用的。

完成一个http响应需要发送关闭请求。 end 方法或 send 方法可以做到这一点。将状态代码设置为响应 http 永远不会向前端发送任何内容。这就是为什么您的角度回调从未被触发的原因。

所以我建议你将标签 expressjs 添加到你的问题中,因为这不是 AngularJS 的问题,而是一个真正的 expressJS 错误。

【讨论】:

  • 你是对的。自从删除完成后,我认为它是有角度的,但后来我发现它实际上是 de Api。我会检查你所说的,所有其他方法(获取、保存等)发送res.send(dog),但删除是我在操作中发布的。我会添加标签。
【解决方案2】:

我最近正在使用 ngResource。就我而言,我在该 api 调用中使用了三个参数。因此,您可以使用

dogsResource.delete({id: $stateParams.dogId}, function(value, responseHeaders){
            //Success
            console.log(value);
            console.log(responseHeaders);
        },
        function(httpResponse){
            //Error
            console.log(httpResponse);
        }
    );

希望对你有帮助。

【讨论】:

    【解决方案3】:

    使用$resource 对象的承诺返回。作为 $resource 对象默认返回一个 promise 对象,并且该 promise 对象在 .$promise 变量上可用 $resource API 方法。

    代码

    dogsResource.delete({id: $stateParams.dogId}).$promise.then(function(data)//Success
         console.log(value);
    },
    function(httpResponse){ //Error
        console.log(httpResponse);
    });
    

    【讨论】:

    • @CamiloR 你能在你的问题中添加你的dogsResource 代码吗?
    • 这里是资源的代码,希望对您有所帮助。
    • @CamiloR 尝试将您的 $resource 对象更改为 $resource("http://localhost:5000/dogs/:id",{ },{update: {method: "PUT"}}),因为您在传递其值时使用了相同的属性名称 id
    【解决方案4】:

    在您的代码中,第二个参数是angular.noop

    dogsResource.delete({id: $stateParams.dogId}, angular.noop,
            function(value, responseHeaders){
                //Success
                console.log(value);
                console.log(responseHeaders);
            },
            function(httpResponse){
                //Error
                console.log(httpResponse);
            }
        );
    

    根据ngResource Source Code,如果您将第二个参数设置为一个函数(angular.noop 一个函数),那么它将使用第二个参数作为成功回调。由于第二个参数是空操作,所以调用它时不会发生任何事情。

    尝试将第二个参数设置为function (r) { console.log (r) },看看会得到什么。

    【讨论】:

    • 不,不是那样,正如我在操作的评论中所说的那样。即使按照您所说的进行更改,也不会调用回调。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多