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 и почтальон он всегда пуст.

Однако через curl

 $ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/ 

он работает по назначению.

Я попытался вручную установить Content-type : application/json в первом, но я всегда получаю 400 bad request

Это сводило меня с ума.

Я думал, что что-то обновлено в body-parser, но я понизился, и это не помогло.

Любая помощь оценивается, спасибо.

В 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

С помощью 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 

Почтовая почта

Я сделал очень тупые ошибки и забыл определить атрибуты name для ввода в моем html-файле.

Поэтому вместо

  

У меня есть это.

  

Теперь request.body заполняется следующим образом: { password: 'hhiiii' }

Сегодня я столкнулся с этой проблемой и исправил ее, чтобы удалить заголовок Content-type в Postman! Очень странно. Добавьте его сюда, если это поможет кому-то.

Я следил за учебником BeerLocker: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/

Я обнаружил, что он работает при отправке с типом контента

“Применение / 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 на сервере.

Даже когда я изучал node.js в первый раз, когда начал изучать его через веб-приложение, я все это делал хорошо в своей форме, но я не смог получить значения в почтовом запросе. После длительной отладки я узнал, что в форме я предоставил enctype="multipart/form-data" из-за чего я не смог получить значения. Я просто удалил его, и это сработало для меня.

Аналогичная проблема возникла со мной, я просто смешал порядок параметров обратного вызова. Убедитесь, что вы настроили функции обратного вызова в правильном порядке. По крайней мере, для тех, кто имеет ту же проблему.

 router.post('/', function(req, res){}); 

Кажется, что если вы не используете какой-либо encType (по умолчанию используется application/x-www-form-urlencoded ), вы получаете текстовые поля ввода, но вы не получите файл.

Если у вас есть форма, в которой вы хотите опубликовать ввод текста и файл, используйте тип кодирования multipart/form-data и в дополнение к этому используйте промежуточное ПО multer . Multer проанализирует объект запроса и подготовит req.file для вас, а все остальные поля ввода будут доступны через req.body .

Убедитесь, что [“key”: “type”, “value”: “json”] & [“key”: “Content-Type”, “value”: “application / x-www-form-urlencoded”] находится в вашем заголовки запросов почтальона

Моя проблема заключалась в том, что я сначала создавал маршрут

 // ... router.get('/post/data', myController.postHandler); // ... 

и регистрация промежуточного программного обеспечения после маршрута

 app.use(bodyParser.json()); //etc 

из-за структуры приложения и копирования и вставки проекта из примеров.

Как только я исправил порядок регистрации промежуточного программного обеспечения до маршрута, все это сработало.

Вы должны проверить правильность установки промежуточного программного обеспечения 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».

Я использовал рестайлинг вместо выражения и столкнулся с той же проблемой. необходимо было решить:

server.use (restify.bodyParser ());

Я решил это, используя multer как было предложено выше, но они пропустили, давая полный рабочий пример, о том, как это сделать. В основном это может произойти, если у вас есть группа форм с enctype="multipart/form-data" . Вот HTML для формы, которую я имел:

 

И вот как использовать 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)); } }); } 
  • Надежность транспорта Websocket (потеря данных Socket.io при повторном подключении)
  • Почему node.js обрабатывает только шесть запросов одновременно?
  • Получить все каталоги в каталоге nodejs
  • обнаружена утечка памяти EventEmitter
  • (узел: 3341) Устаревание Предупреждение: Mongoose: mpromise
  • выборочная проверка mongoose с использованием 2 полей
  • Node.js подключается только к localhost
  • Как включить обработчики маршрута в несколько файлов в Express?
  • Виртуальный хостинг с автономным сервером node.js
  • Как разместить приложение Node.Js в режиме совместного доступа
  • «Сообщение не удалось извлечь из реестра» при попытке установить любой модуль
  • Давайте будем гением компьютера.