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 错误。
我有这个代码:
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 错误。