angular度$资源删除不会发送正文express.js服务器

惠,

我正在服务器端build立一个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中的path发布和angular.js保存它工作正常。

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

谢谢。

根据这个堆栈溢出问题和$http服务源代码 ,使用$httpDELETE请求不允许在请求的主体中发送数据。 DELETE请求的规范对于是否允许请求主体有些模糊,但是Angular不支持。

允许请求主体的唯一方法是POSTPUTPATCH 。 所以这个问题不在你的代码中,在Angular的$http服务中。

我的build议是使用通用的$http(...)函数,并传递适当的方法:

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

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

  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" }; 

刚碰到这个问题。 你将不得不使用url参数发送一个ID删除。

在快递中:

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

并添加到angular的url:

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

以下为我工作:

 $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获取更多信息。

这对我有效。

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

接着

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

如果你想使用$资源对象而不是$ http,你需要添加hasBodyheaders如下:

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

为我工作