AngularJS ngResource删除事件不调用callback

我有这个代码:

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

删除完成 ,问题是没有成功或错误被称为。 我也试过使用一个实例(这意味着,使用$删除),但它也没有工作。

我试着用其他方法来testingcallback,比如get

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

它工作。 我不知道为什么会发生,因为狗正在从数据库中删除。

谢谢

UPDATE

dogResource代码

 // 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发送任何东西,所以不会触发callback:

 //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).end()replaceres.status(200) res.status(200).end()得到了触发的callback。

谢谢你们所有的时间。

       

网上收集的解决方案 "AngularJS ngResource删除事件不调用callback"

我build议你不要使用

res.status(200).END()

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

所以,而不是使用

res.status(200).END()

使用

res.send(狗)

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

res.status(204).END()

204无内容

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

并完成一个http响应需要发送closures请求。 结束方法或发送方法使。 设置一个状态码到一个响应http永远不会发送任何东西到前端。 这就是为什么你的angular度callback从未被解雇。

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

在你的代码中,第二个参数是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源代码 ,如果您将第二个参数设置为函数( angular.noop 一个函数),那么它将使用第二个参数作为成功callback。 由于第二个参数是无操作,因此调用它时不会发生任何事情。

尝试将第二个参数设置为function (r) { console.log (r) }并查看得到的结果。

我最近正在使用ngResource。 在我的情况下,我已经在这个API调用中使用了三个参数。 所以,你可以使用

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

我希望有帮助。

使用$resource对象的promise返回。 由于$ resource对象默认返回一个promise对象,并且该promise对象可用.$promisevariables通过$resource API方法。

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