web-dev-qa-db-fra.com

angular $ resource delete n'enverra pas le corps au serveur express.js

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.

22
lobengula3rd

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'}
})
38
tennisgent

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" };
37
jtello

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'}) ...
1
Corey Rothwell

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.

0
Tigertron

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

0
shgutman

Cela a fonctionné pour moi.

$httpProvider.defaults.headers.delete = { "Content-Type": "application/json;charset=utf-8" };

Et alors

$http.delete(url, { data: data })
0
Diego Mello