AngularJS ngResource 删除事件未调用回调

AngularJS ngResource delete event not calling callback

我有这个代码:

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:

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 一个函数)那么它将使用第二个参数作为成功回调。由于第二个参数是 no-operation,因此调用它时不会发生任何事情。

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

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

代码

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

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

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

希望对您有所帮助。

我建议你不要使用

res.status(200).end()

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

所以不用

res.status(200).end()

使用

res.send(dog)

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

res.status(204).end()

204 NO CONTENT

请注意,您不需要设置状态码,默认情况下它是200。所以将状态码设置为200是没有用的。

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

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