Req.body пуст в сообщениях
Внезапно это происходит со всеми моими проектами.
Всякий раз, когда я делаю сообщение в nodejs с помощью выражения и body-parser req.body
, это пустой объект.
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())
// parse application/json
app.use(bodyParser.json())
app.listen(2000);
app.post("/", function (req, res) {
console.log(req.body) // populated!
res.send(200, req.body);
});
Через ajax и postman он всегда пуст.
Однако через curl
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
он работает по назначению.
Я попытался вручную установить Content-type : application/json
в первом, но я всегда получаю 400 bad request
Это сводило меня с ума.
Я думал, что что-то обновлено в body-parser, но я понизил рейтинг, и это не помогло.
Любая благодарность, спасибо.
Ответы
Ответ 1
В Postman из 3 доступных для типа содержимого вариантов выберите "X-www-form-urlencoded", и он должен работать.
Также, чтобы избавиться от сообщения об ошибке, замените:
app.use(bodyParser.urlencoded())
С
app.use(bodyParser.urlencoded({
extended: true
}));
См. https://github.com/expressjs/body-parser
Средство связывания "тело-парсер" обрабатывает только JSON и urlencoded данные, а не multipart
Ответ 2
В Postman для проверки действий HTTP-сообщений с сырой загрузкой данных JSON выберите параметр raw
и установите следующие параметры заголовка:
Content-Type: application/json
Кроме того, не забудьте обернуть все строки, используемые в качестве ключей/значений в вашей полезной нагрузке JSON, в двойных кавычках.
Пакет body-parser
будет разбирать многострочные полезные JSON файлы очень хорошо.
{
"foo": "bar"
}
Протестировано в Chrome v37 и v41 с расширением Postman v0.8.4.13 (body-parser
v1.12.2 и express
v4.12.3) с настройкой ниже:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(bodyParser.json());
// ... Your routes and methods here
![Postman raw json payload]()
Ответ 3
Я сделал очень тупую ошибку и забыл определить атрибуты name
для входов в моем html файле.
Итак, вместо
<input type="password" class="form-control" id="password">
У меня есть это.
<input type="password" class="form-control" id="password" name="password">
Теперь request.body
заполняется следующим образом: { password: 'hhiiii' }
Ответ 4
Я обнаружил, что он работает при отправке с типом контента
"приложения/JSON"
в сочетании с серверной стороной
app.use(bodyParser.json());
Теперь я могу отправить через
var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);
и результат доступен в request.body.name
на сервере.
Ответ 5
Сегодня я столкнулся с этой проблемой и зафиксировал ее удалить заголовок содержимого в Postman! Очень странно. Добавьте его здесь, если он поможет кому-то.
Я следил за учебником BeerLocker: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
Ответ 6
Вы должны проверить, правильно ли установлено промежуточное ПО body-parser для типа запроса (json, urlencoded).
Если вы установили,
app.use(bodyParser.json());
тогда в почтальоне вы должны отправить данные в сыром виде.
https://i.stack.imgur.com/k9IdQ.png скриншот почтальона
Если вы установили,
app.use(bodyParser.urlencoded({
extended: true
}));
Затем следует выбрать параметр "x-www-form-urlencoded".
Ответ 7
Моя проблема заключалась в том, что я сначала создавал маршрут
// ...
router.get('/post/data', myController.postHandler);
// ...
и регистрация промежуточного программного обеспечения после маршрута
app.use(bodyParser.json());
//etc
из-за структуры приложения и копирования и вставки проекта из примеров.
Как только я установил порядок регистрации промежуточного программного обеспечения перед маршрутом, все заработало.
Ответ 8
Даже когда я изучал node.js в первый раз, когда начал изучать его через веб-приложение, я все это делал хорошо в своей форме, но я не смог получить значения в почтовый запрос. После длительной отладки я узнал, что в форме, которую я предоставил enctype="multipart/form-data"
, из-за которой я не смог получить значения. Я просто удалил его, и это сработало для меня.
Ответ 9
Кажется, что если вы не используете какой-либо тип encType (по умолчанию application/x-www-form-urlencoded
), вы получаете поля ввода текста, но не получаете файл.
Если у вас есть форма, в которой вы хотите разместить ввод текста и файл, тогда используйте тип кодирования multipart/form-data
и в дополнение к этому используйте промежуточное программное обеспечение multer
. Multer проанализирует объект запроса и подготовит для вас req.file
, а все остальные поля ввода будут доступны через req.body
.
Ответ 10
Аналогичная проблема возникла со мной, я просто смешал порядок параметров обратного вызова. Убедитесь, что вы настроили функции обратного вызова в правильном порядке. По крайней мере, для тех, кто имеет ту же проблему.
router.post('/', function(req, res){});
Ответ 11
Я решил это, используя multer
как предложено выше, но они упустили полный рабочий пример того, как это сделать. В основном это может произойти, когда у вас есть группа форм с enctype="multipart/form-data"
. Вот HTML-код для формы, которую я имел:
<form action="/stats" enctype="multipart/form-data" method="post">
<div class="form-group">
<input type="file" class="form-control-file" name="uploaded_file">
<input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
<input type="submit" value="Get me the stats!" class="btn btn-default">
</div>
</form>
А вот как использовать multer
для получения значений и имен этой формы с помощью Express.js
и node.js
:
var multer = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
// req.file is the name of your file in the form above, here 'uploaded_file'
// req.body will hold the text fields, if there were any
console.log(req.file, req.body)
});
Ответ 12
Убедитесь, что [ "key": "type", "value": "json" ] и [ "key": "Content-Type", "value": "application/x-www-form-urlencoded" ] находится в ваших заголовках запроса postman.
Ответ 13
Вы не должны делать JSON.stringify(data) при отправке через AJAX, как показано ниже
this is not correct code
function callAjax(url, data) {
$.ajax({
url: url,
type: "POST",
data: JSON.stringify(data),
success: function(d) {
alert("successs "+ JSON.stringify(d));
}
});
}
правильный код
function callAjax(url, data) {
$.ajax({
url: url,
type: "POST",
data: data,
success: function(d) {
alert("successs "+ JSON.stringify(d));
}
});
}
Ответ 14
У меня была такая же проблема несколько минут назад, я попробовал все возможное в приведенных выше ответах, но любой из них работал.
Единственное, что я сделал, это обновил версию Node JS, я не знал, что обновление может на что-то повлиять, но это помогло.
Я установил Node JS версии 10.15.0
(последняя версия), вернулся на 8.11.3
и все теперь работает. Возможно, модуль body-parser
должен исправить это.
Ответ 15
Я использовал restify вместо express и столкнулся с той же проблемой. Решение было сделать:
server.use(restify.bodyParser());
Ответ 16
Я перепробовал все возможные варианты ответов выше, но ни один из них не сработал. Я использовал...
введите описание изображения здесь
Единственное, что я сделал, был изменен мой код для ввода описания изображения здесь
и это сработало
Ответ 17
У меня не было имени во входных данных... мой запрос был пуст... рад, что он закончен, и я могу продолжать кодировать. Спасибо всем!
Ответ, который я использовал Джейсон Ким:
Так что вместо
<input type="password" class="form-control" id="password">
у меня есть это
<input type="password" class="form-control" id="password" name="password">
Ответ 18
Я верю, что это может решить app.use(express.json());
Ответ 19
Измените app.use(bodyParser.urlencoded());
в вашем коде на
app.use(bodyParser.urlencoded({extended : false}));
и в почтальоне, в заголовке изменить значение Content-Type
с
application/x-www-form-urlencoded
- application/json
Та :-)