angular $resource delete won't send body to ex

2019-01-11 01:47发布

问题:

hye,

i am building an app with angular.js and node.js (Express.js) on the server side.

for some reason i am having a problem handling a delete request. no body is getting to the server side.

this is my angular.js resource code:

$scope.deleteProject = function(projectName){
    var postData = {username: 'name', projectName: projectName};
    Project.deleteProject.delete({}, postData,
        function(res){
            alert('Project Deleted');
        },
        function(err){
            alert(err.data);
    });
}

on the server side i have this:

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');
}

now for some reason there is no body at all!! it is empty. i have defined the route as app.delete.

if i change the route in node.js to post and in angular.js to save it works fine.

what am i missing here (banging my head).

thanks.

回答1:

As per this stack overflow question and the $http service source code, a DELETE request using $http does not allow for data to be sent in the body of the request. The spec for a DELETE request is somewhat vague on whether or not a request body should be allowed, but Angular does not support it.

The only methods that allow for request bodies are POST, PUT, and PATCH. So the problem is not anywhere in your code, its in Angular's $http service.

My suggestion would be to use the generic $http(...) function and pass in the proper method:

$http({
    method: 'DELETE',
    url: '/some/url',
    data: {...},
    headers: {'Content-Type': 'application/json;charset=utf-8'}
})


回答2:

Angular by default sends the Content-Type as text/plain for DELETE requests. Just add this to the headers:

  var config = {
    method: "DELETE"
    url: yourUrl
    data: yourData
    headers: {"Content-Type": "application/json;charset=utf-8"}
  };

  $http(config);

If you want to add them to every single DELETE request add this to the app.config method in your main controller:

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


回答3:

Just ran into this problem. You'll have to use url params to send an id with delete.

in express:

app.delete('/api/user/:userId', user.remove);

and add to the url in angular:

$http({url: 'whatever/api/'+obj.id, method: 'DELETE'}) ...


回答4:

The following works for me:

$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json;charset=utf-8';

XMLHttpRequest is optional but useful if you are sending ajax. https://docs.angularjs.org/api/ng/provider/$httpProvider for more information.



回答5:

This worked for me.

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

And then

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


回答6:

If you want to use the $resource object instead of $http you need to add hasBody and headers as follow:

delete:  {
    method: 'DELETE',
    hasBody: true,
    headers: {"Content-Type": "application/json;charset=UTF-8"}
  }

Worked for me