惠,
我正在服务器端使用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中保存它可以正常工作。
我在这里失踪了什么(敲打我的脑袋)。
感谢。
答案 0 :(得分:38)
根据this stack overflow question和$http
service source code,使用DELETE
的{{1}}请求不允许在请求正文中发送数据。 The spec for a DELETE request对于是否应该允许请求正文有些模糊,但Angular不支持它。
允许请求正文的唯一方法是$http
,POST
和PUT
。所以问题不在你的代码中的任何地方,而是在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,则需要添加hasBody
和headers
,如下所示:
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 })