Подтвердить что ты не робот

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, чтобы сохранить его, отлично работает.

что мне здесь не хватает (ударило головой).

спасибо.

4b9b3361

Ответ 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"}
  }

Работал для меня