Экспресс-анализатор тела req.body с данными формы является пустым объектом

Почему-то мой req.body всегда пуст, может быть, у вас есть идея:

вот мой код сервера:

const Express = require('express');
const bodyParser = require('body-parser');

const app = new Express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.post('/save', (req, res) => {
  console.log(req.body)  // => {}
  res.send(req.body);
});

const env = process.env.NODE_ENV || 'production';
app.listen(3000, err => {
   if (err) { return console.error(err); }
   console.info(`Server running on http://localhost:${port} [${env}]`);
});

Когда я пытаюсь отправить данные формы с помощью javascript, req.body пуст:

const data = new FormData(document.querySelector('form'));
console.log(data);  // seems empty already??? FormData{}??
const xhr = new XMLHttpRequest();
xhr.open('POST', 'http://localhost:3000/save');
xhr.send(data);

То же самое с почтальоном:

почтальон

я этого не понимаю…

Отправка x-www-form-urlencoded с почтальоном или raw (application/json) работает в почтальоне. Но отправка тех же заголовков с Formdata в javascript все равно приведет к пустому объекту…


person chitzui    schedule 01.07.2017    source источник
comment
body-parser не поддерживает данные формы, вам нужен multer или что-то подобное.   -  person robertklep    schedule 01.07.2017
comment
Связано: stackoverflow.com/questions /7542586/   -  person Wiktor Zychla    schedule 12.12.2017


Ответы (4)


Чтобы зарегистрировать каждое поле в formData

let myForm = document.getElementById('myForm');
formData = new FormData(myForm);

for (let [key, value] of formData.entries()) { 
  console.log(key, value);
}

Скрипт — https://jsfiddle.net/thesumit67/j4znhxa5/1/

Чтобы справиться с этим через экспресс, используйте multer. Вот пример: https://www.npmjs.com/package/multer.

Обязательно добавьте enctype="multipart/form-data" к элементу формы. В противном случае Мултер проигнорирует его.

let multer = require('multer');
let upload = multer();

app.post('/save', upload.fields([]), (req, res) => {
  console.log( req.body );
  console.log( req.files );
  res.sendStatus(200);
});
person Sumit M    schedule 01.07.2017

body-parser устарел и больше не является частью Express.

Кроме того, body-parser не предоставляет функциональные возможности для анализа данных сообщения формы.

Из репозитория body-parser описание:

Это не касается составных тел из-за их сложной и обычно большой природы. Для составных тел вас могут заинтересовать следующие модули:

person Akim Kelar    schedule 03.07.2019

Насколько я понимаю, проблема может быть в форме HTML.

<form action="" method="POST">
 <input type="text" name="foo[bar]">
 <button>Submit</button>
</form>

Тогда в коде сервера это может выглядеть примерно так.

 app.post('/save', (req, res) => {
 console.log(req.body.foo)  // => {}
 res.send(req.body.foo);
});

Опять же, этот пост старше, поэтому вы, вероятно, уже исправили его.

person James Lewis    schedule 11.12.2017

Версия экспресс-парсера и парсера тела:

"dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
  }

app.js:

const express = require('express');
var bodyParser = require('body-parser')

const app = express();

app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 
app.use( bodyParser.json()); 

const baseUrl = '/api/v1/tours';
app.post(baseUrl, (req, res)=>{
    console.log(req.body);
    res.send('Done');
})
//starting server
const port = 3000;
app.listen(port, ()=>{
    console.log(`app running on port ${port}...`);
});

Чтобы отправить необработанные данные, выберите JSON из списка введите здесь описание изображения

person Lord    schedule 21.05.2020