запрос.тело пустое на столбах
внезапно это произошло со всеми моими проектами.
всякий раз, когда я делаю сообщение в nodejs с помощью express и 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 и почтальона он всегда пуст.
однако через curl
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
он работает по назначению.
я попробовал вручную установить Content-type : application/json в первом, но я тогда всегда получаю 400 bad request
это сводило меня с ума.
I думал, что что-то Обновлено в body-parser, но я понизил рейтинг, и это не помогло.
любая помощь ценится, спасибо.
14 ответов:
в Postman из 3 вариантов, доступных для типа контента, выберите "X-www-form-urlencoded", и он должен работать.
также, чтобы избавиться от сообщения об ошибке замена:
app.use(bodyParser.urlencoded())С:
app.use(bodyParser.urlencoded({ extended: true }));см.https://github.com/expressjs/body-parser
промежуточное программное обеспечение 'body-parser' обрабатывает только данные JSON и urlencoded, а не multipart
С помощью Postman, чтобы проверить действия HTTP post с помощью полезной нагрузки данных raw JSON, выберите
rawопция и установите следующие параметры заголовка:Content-Type: application/jsonкроме того, убедитесь, что все строки, используемые в качестве ключей/значений в полезной нагрузке JSON, заключены в двойные кавычки.
The
body-parserпакет будет анализировать многострочные raw JSON полезные нагрузки просто отлично.{ "foo": "bar" }протестировано в Chrome v37 и v41 с расширением Postman v0.8.4.13 (
body-parserВ1.12.2 иexpressv4. 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
Я сделал очень глупую ошибку и забыл определить
nameатрибуты для входных данных в моем html-файле.так вместо
<input type="password" class="form-control" id="password">у меня есть это.
<input type="password" class="form-control" id="password" name="password">теперь
request.bodyзаполняется так:{ password: 'hhiiii' }
я обнаружил, что это работает при отправке с типом контента
"application/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на сервере.
Я столкнулся с этой проблемой сегодня, и что исправлено это было удалить заголовок типа содержимого в почтальона! Очень странный. Добавляя его здесь, если это кому-то поможет.
Я следил за учебником BeerLocker здесь: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
даже когда я изучал узел.js впервые, когда я начал изучать его через веб-приложение, у меня были все эти вещи, сделанные хорошо в моей форме, но я не смог получить значения в запросе post. После долгой отладки, я узнал, что в форме, которую я предоставил
enctype="multipart/form-data"из-за чего я не смог получить значения. Я просто удалил его, и это сработало для меня.
аналогичная проблема произошла со мной, я просто смешал порядок параметров обратного вызова. Убедитесь, что вы настраиваете функции обратного вызова в правильном порядке. По крайней мере, для тех, у кого такая же проблема.
router.post('/', function(req, res){});
кажется, если вы не используете какой-либо encType (по умолчанию
application/x-www-form-urlencoded) тогда вы получаете поля ввода текста, но вы не получите файл.если у вас есть форма, в которой вы хотите разместить ввод текста и файл, то используйте
multipart/form-dataтип кодировки и в дополнение к этому использоватьmulterпромежуточное. Мультер разберет объект запроса и подготовитreq.fileдля вас и всех других полей ввода будут доступны черезreq.body.
вы должны проверить, правильно ли установлено промежуточное программное обеспечение body-parser для типа запроса(json, urlencoded).
Если вы установили,
app.use(bodyParser.json());затем в postman вы должны отправить данные как raw.
https://i.stack.imgur.com/k9IdQ.png скриншот почтальона
Если вы установили,
app.use(bodyParser.urlencoded({ extended: true }));затем должна быть выбрана опция 'x-www-form-urlencoded'.
убедитесь, что ["key": "type", "value": "json"] & ["key": "Content-Type","value": "application/x-www-form-urlencoded"] находится в заголовках запроса почтальона
моя проблема была в том, что я сначала создавал маршрут
// ... router.get('/post/data', myController.postHandler); // ...и регистрация промежуточного программного обеспечения после маршрут
app.use(bodyParser.json()); //etcиз-за структуры приложения и копирования и вставки проекта вместе с примерами.
Как только я исправил порядок регистрации промежуточного программного обеспечения перед маршрутом, все это сработало.
Я был с помощью restify выглядит следующим образом вместо того, чтобы выразить и столкнулся с той же проблемой. решение должно было сделать:
сервер.использовать(restify выглядит следующим образом.bodyParser());
я решил это с помощью
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) });
вы не должны делать JSON.stringify (данные) при отправке через 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)); } }); }

Comments