【问题标题】:angular $resource delete won't send body to express.js serverangular $resource delete 不会将正文发送到 express.js 服务器
【发布时间】:2014-04-06 20:33:50
【问题描述】:

嘿,

我正在服务器端使用 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 中进行保存以正常工作。

我在这里错过了什么(敲我的头)。

谢谢。

【问题讨论】:

标签: node.js angularjs express


【解决方案1】:

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

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

为我工作

【讨论】:

  • hasBody 是在 Angular 1.6.4 中添加的,所以如果您使用的是早期版本,这将不起作用。
【解决方案2】:

这对我有用。

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

然后

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

【讨论】:

    【解决方案3】:

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

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

    我的建议是使用通用的$http(...) 函数并传入正确的方法:

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

    【讨论】:

    • 为什么放?提出删除请求似乎是非常错误的。可以发帖吗?
    • PUT 通常用于“修改”现有记录。 POST 通常用于“创建”。使用哪一个并不重要,这完全取决于您。
    • 所有http服务代码不支持body的有什么原因吗?目前我主要将服务代码用于语义目的。
    • 如果由我来决定,我会允许所有请求类型的请求正文,但 Angular 团队出于某种原因决定不支持删除它。不知道为什么。不知道是不是真的有原因。
    • 当您说$http 不支持删除正文时,您应该声明您指的是$http.delete() 函数。如果您仅使用$http(config),即使删除也完全可以发送消息正文...
    【解决方案4】:

    以下对我有用:

    $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】:

      默认情况下,Angular 将 Content-Type 作为文本/纯文本发送给 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" };
      

      【讨论】:

      • 很棒的解决方案.. 非常适合我.. 谢谢 jtello :-)
      • 非常适合我
      【解决方案6】:

      刚刚遇到这个问题。您必须使用 url 参数来发送带有删除的 id。

      快递:

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

      并以角度添加到网址:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-17
        • 1970-01-01
        • 2015-06-11
        • 2021-03-05
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        相关资源
        最近更新 更多