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 на сервере.

Ответ 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());

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

Та :-)