Angular $resource delete не отправит тело на сервер express.js
Хе,
Я создаю приложение с 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 для публикации и в angular.js, чтобы сохранить его, отлично работает.
что мне здесь не хватает (ударило головой).
спасибо.
Ответы
Ответ 1
По этот вопрос и $http
исходный код службы, запрос DELETE
с использованием $http
не позволяет отправлять данные в тело запроса. Спецификация для запроса DELETE несколько расплывчата в отношении того, нужно ли разрешать тело запроса, но Angular не поддерживает его.
Единственными методами, которые позволяют тела запроса, являются POST
, PUT
и PATCH
. Поэтому проблема не в вашем коде, а в Angular $http
.
Мое предложение состояло в том, чтобы использовать общую функцию $http(...)
и передать соответствующий метод:
$http({
method: 'DELETE',
url: '/some/url',
data: {...},
headers: {'Content-Type': 'application/json;charset=utf-8'}
})
Ответ 2
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" };
Ответ 3
Просто столкнулся с этой проблемой. Вам нужно будет использовать параметры url для отправки идентификатора с удалением.
в экспресс:
app.delete('/api/user/:userId', user.remove);
и добавьте URL-адрес в angular:
$http({url: 'whatever/api/'+obj.id, method: 'DELETE'}) ...
Ответ 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
Это сработало для меня.
$httpProvider.defaults.headers.delete = { "Content-Type": "application/json;charset=utf-8" };
И затем
$http.delete(url, { data: data })
Ответ 6
Если вы хотите использовать объект $resource вместо $http, вам нужно добавить hasBody
и headers
следующим образом:
delete: {
method: 'DELETE',
hasBody: true,
headers: {"Content-Type": "application/json;charset=UTF-8"}
}
Работал для меня