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,您需要添加 hasBody
和 headers
,如下所示:
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,使用$http
的DELETE
请求不允许在请求正文中发送数据。 The spec for a DELETE request 对于是否应允许请求正文有些模糊,但 Angular 不支持。
允许请求正文的唯一方法是POST
、PUT
和PATCH
。所以问题不在于您的代码中的任何地方,而在于 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:自定义标头被 $http 和 $resource 忽略。为啥?