2016-07-10 6 views
7

Итак, у меня есть следующий код в моем файле server.js, который я запускаю с node.js. Я использую выражение для обработки HTTP-запросов.Express.js POST req.body empty

app.post('/api/destinations', function (req, res) { 
    var new_destination = req.body; 
    console.log(req.body); 
    console.log(req.headers); 
    db.Destination.create(new_destination, function(err, destination){ 
    if (err){ 
     res.send("Error: "+err); 
    } 
    res.json(destination); 
    }); 
}); 

Я бегу следующее в терминале:

curl -XPOST -H "Content-Type: application/json" -d '{"location": "New York","haveBeen": true,"rating": 4}' http://localhost:3000/api/destinations 

После запуска, что server.js распечатывает следующее.

{} 
{ host: 'localhost:3000', 
    'user-agent': 'curl/7.43.0', 
    accept: '*/*', 
    'content-type': 'application/json', 
    'content-length': '53' } 

Так req.body является {}. Я читал другие сообщения о переполнении стека о похожих проблемах, когда тип содержимого был неправильным из-за body-parser. Но это не проблема, потому что контент-тип - application/json.

Любые идеи о том, как получить фактическое тело запроса?

Заранее спасибо.

+0

Вы используете промежуточное программное обеспечение body-parser, правильно? – Cristy

+0

И если вы: как именно? – robertklep

+0

Я использую body-parser. В основном просто требуется его «app.use (bodyParser.urlencoded ({extended: true))); без котировок, конечно. –

ответ

16

Вам нужно bodyParser.json, а также:

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

Это сработало. Спасибо!! Не могу поверить, что я это забыл. –

+2

Спасибо! Не знаю, почему, но когда я попробовал 'app.use (bodyParser.json()); 'после прочтения вашего комментария, это сработало, хотя я пробовал это много раз раньше. Должен быть волшебный ответ;) – TetraDev

+5

У меня все еще есть пустое тело, несмотря на включение обеих строк. Не знаю, почему. – Micrified

5

Иногда req.body показывает {}, если вы забыли поставить имя атрибута в форме полей ввода. Ниже приведен пример:

<input type="email" name="myemail" class="form-control" id="exampleInputEmail2" placeholder="Email address" required> 

Тогда req.body показывает { myemail: '[email protected]' }

Я отправляю этот ответ, потому что, я столкнулся с подобной проблемой, и это работает для меня.

+0

Мне было интересно, почему парсер тела работает только с атрибутами «имя» в входах, а не только с «id». Этот ответ мне очень помогает, иногда мы просто забываем об этих основных вещах. Ps: In .NET, I никогда не использовал имена в полях ввода, поэтому это было необычно для меня. –