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

Posted

技术标签:

【中文标题】angular $resource delete 不会将正文发送到 express.js 服务器【英文标题】:angular $resource delete won't send body to express.js server 【发布时间】: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 中进行保存以正常工作。

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

谢谢。

【问题讨论】:

What is a clean way to send a body with DELETE request?的可能重复 【参考方案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') ...

【讨论】:

以上是关于angular $resource delete 不会将正文发送到 express.js 服务器的主要内容,如果未能解决你的问题,请参考以下文章

angular-resource.js encodeUriSegment 问题

Angular $resource get 与 $get

Angular:自定义标头被 $http 和 $resource 忽略。为啥?

angular.js $resources 设置授权头

Angular $resource 和自托管 WebAPI 的 CORS 问题

访问控制不接受 Angular $resource 调用允许 Safari 与 Chrome 接受