2016-06-13 3 views
2

Я использую expressjs и промежуточное программное обеспечение body-parser.тело пусто при разборе DELETE-запрос с выражением и тело-парсер

Это, как я начинаю его:

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

От клиента я посылаю запрос DELETE и при попытке поднять его на стороне сервера я получаю пустой объект:

app.delete('/', function(req, res) { 
    console.log(util.inspect(req.body)); //outputs {} 
    //some more code 
}); 

однако, когда я отправить его с POST я получаю то, что мне нужно:

app.post('/delete', function(req, res) { 
    console.log(util.inspect(req.body)); //outputs { mid: 'ffw1aNh2' } 
    //some more code 
}); 

стоит отметить, что я не изменить что-либо на стороне клиента (angularjs), но метод и URL-адрес и сетевой отладчик firefox показывают данные, отправляемые в обеих ситуациях.

Что здесь отсутствует? Почему я получаю пустой объект тела в методе удаления?

+0

[Это] (http://stackoverflow.com/questions/299628/is-an-entity-body-allowed -for-an-http-delete-request) может представлять интерес. – JAM

+0

Это не помогает мне понять. Там говорится, что запросы DELETE имеют тело и, кроме того, не противоречат или не разрешаются. Так что еще больше повода думать, что объект тела не должен быть пустым, нет? –

+0

'body-parser' не заботится о том, что HTTP-метод используется AFAIK, и он должен отлично работать с' DELETE'. Загорается ли заголовок 'Content-Type' объекта _request_? – robertklep

ответ

11

Исходный код службы $ http, запрос DELETE с использованием $ http не позволяет отправлять данные в тело запроса.

Спецификация для запроса DELETE несколько расплывчата относительно того, разрешен ли орган запроса, но Angular не поддерживает его.

Единственными методами, которые позволяют запрашивать тела, являются POST, PUT и PATCH. Таким образом, проблема не в любом месте вашего кода, его в службе Angular's $ http.

Используйте этот

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

, а затем

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

+0

Я почтительно не согласен на основании простых фактов. как я сказал в своем вопросе, отладчик сети Firefox четко показывает, что мои данные отправляются. –

+0

... Но с неправильным заголовком! Это исправить. Хотя мне пришлось отказаться от «Провайдера» просто «$ http.defaults ...» –

+0

$ httpProvider должен использоваться в вашей конфигурации таким образом, что он находится в центральном месте вашего приложения – jgerstle

 Смежные вопросы

  • Нет связанных вопросов^_^