angular $ resource delete不会将body发送到express.js服务器

时间:2014-03-05 01:25:04

标签: node.js angularjs express

惠,

我正在服务器端使用angular.js和node.js(Express.js)构建应用程序。

由于某种原因,我在处理删除请求时遇到问题。没有人到达服务器端。

这是我的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);
    });
}

在服务器端我有这个:

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

现在由于某种原因,根本没有身体!它是空的。 我已将路线定义为app.delete。

如果我将node.js中的路由更改为post并在angular.js中保存它可以正常工作。

我在这里失踪了什么(敲打我的脑袋)。

感谢。

6 个答案:

答案 0 :(得分:38)

根据this stack overflow question$http service source code,使用DELETE的{​​{1}}请求不允许在请求正文中发送数据。 The spec for a DELETE request对于是否应该允许请求正文有些模糊,但Angular不支持它。

允许请求正文的唯一方法是$httpPOSTPUT。所以问题不在你的代码中的任何地方,而是在Angular的PATCH服务中。

我的建议是使用通用$http函数并传递正确的方法:

$http(...)

答案 1 :(得分:37)

默认情况下,Angular将Content-Type作为text / plain发送给DELETE请求。只需将其添加到标题:

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

  $http(config);

如果要将它们添加到每个DELETE请求中,请将其添加到主控制器中的app.config方法:

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

答案 2 :(得分:1)

刚遇到这个问题。您必须使用url params发送带删除的ID。

快递:

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

并以angular:

添加到网址
$http({url: 'whatever/api/'+obj.id, method: 'DELETE'}) ...

答案 3 :(得分:1)

如果您想使用$ resource对象而不是$ http,则需要添加hasBodyheaders,如下所示:

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

为我工作

答案 4 :(得分:0)

以下适用于我:

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

XMLHttpRequest是可选的,但如果您要发送ajax,则非常有用。 https://docs.angularjs.org/api/ng/provider/ $ httpProvider了解更多信息。

答案 5 :(得分:0)

这对我有用。

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

然后

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