hye,
je construis une application avec angular.js et node.js (Express.js) sur le serveur.
pour une raison quelconque, j'ai un problème de traitement d'une demande de suppression. aucun corps n'atteint le côté serveur.
voici mon code de ressource angular.js:
$scope.deleteProject = function(projectName){
var postData = {username: 'name', projectName: projectName};
Project.deleteProject.delete({}, postData,
function(res){
alert('Project Deleted');
},
function(err){
alert(err.data);
});
}
côté serveur, j'ai ceci:
var deleteProject = function(req, res){
console.log(req.body);
console.log(req.params);
if (req.body.projectName){
//do something
return res.send(200);
}
else
return res.send(400, 'no project name was specified');
}
maintenant pour une raison quelconque il n'y a pas de corps du tout !! il est vide . J'ai défini la route comme app.delete.
si je change la route dans node.js pour poster et dans angular.js pour la sauvegarder, cela fonctionne très bien.
qu'est-ce qui me manque ici (me cogner la tête).
merci.
Selon cette question de débordement de pile et le $http
code source du service , une demande DELETE
utilisant $http
ne permet pas d'envoyer des données dans le corps de la demande. La spécification pour une demande DELETE est assez vague sur le fait qu'un corps de requête doit être autorisé ou non, mais Angular ne le supporte pas.
Les seules méthodes qui autorisent les corps de demande sont POST
, PUT
et PATCH
. Le problème ne se trouve donc pas dans votre code, il est dans le service $http
de Angular.
Ma suggestion serait d'utiliser la fonction générique $http(...)
et de passer à la méthode appropriée:
$http({
method: 'DELETE',
url: '/some/url',
data: {...},
headers: {'Content-Type': 'application/json;charset=utf-8'}
})
Par défaut, Angular envoie le type de contenu sous la forme text/plain pour les demandes DELETE. Ajoutez simplement ceci aux en-têtes:
var config = {
method: "DELETE"
url: yourUrl
data: yourData
headers: {"Content-Type": "application/json;charset=utf-8"}
};
$http(config);
Si vous souhaitez les ajouter à chaque requête DELETE, ajoutez ceci à la méthode app.config de votre contrôleur principal:
$httpProvider.defaults.headers.delete = { "Content-Type": "application/json;charset=utf-8" };
Je viens de rencontrer ce problème. Vous devrez utiliser les paramètres d'URL pour envoyer un identifiant avec delete.
en express:
app.delete('/api/user/:userId', user.remove);
et ajoutez à l'URL en forme angulaire:
$http({url: 'whatever/api/'+obj.id, method: 'DELETE'}) ...
Ce qui suit fonctionne pour moi:
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json;charset=utf-8';
XMLHttpRequest est facultatif mais utile si vous envoyez ajax . https://docs.angularjs.org/api/ng/provider/ $ httpProvider pour plus d'informations.
Si vous souhaitez utiliser l'objet $ resource au lieu de $ http, vous devez ajouter hasBody
et headers
comme suit:
delete: {
method: 'DELETE',
hasBody: true,
headers: {"Content-Type": "application/json;charset=UTF-8"}
}
A travaillé pour moi
Cela a fonctionné pour moi.
$httpProvider.defaults.headers.delete = { "Content-Type": "application/json;charset=utf-8" };
Et alors
$http.delete(url, { data: data })