Express body-parser req.body with formdata is empty object

Express body-parser req.body with formdata is empty object

不知何故我的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);

与邮递员相同:

我不明白这个……

用 postman 发送 x-www-form-urlencodedraw (application/json) 在 postman 中工作。但是在 javascript 中使用 Formdata 发送相同的 headers 仍然会导致空 object…

记录 formData 中的每个字段

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

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

Fiddle - https://jsfiddle.net/thesumit67/j4znhxa5/1/

通过快速使用multer来处理它。 这是一个例子 - https://www.npmjs.com/package/multer

确保在表单元素上添加 enctype="multipart/form-data"。否则 Multer 会忽略它。

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);
});

据我了解,问题可能出在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);
});

同样,这个 post 比较旧,所以您可能已经修复了它。

body-parser 已弃用,不再是 Express 的一部分。

此外,body-parser 不提供解析 form-data post 数据的功能。

来自 body-parser 存储库 description:

This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:

Express 和正文解析器版本:

"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}...`);
});

要发送原始数据,请从列表中 select JSON

我遇到了同样的问题,我正在使用提取 api,将表单数据发送到节点。js/express 后端。问题是我在表单上设置了 enctype='multipart/form-data',并且还在获取 Headers 中设置了 Content-type: multipart/form-data。 从 Headers 中删除 Content-type 让一切正常。 我从这里得到了解决方案 => https://github.com/expressjs/multer/issues/411

如果你使用的是formdata,你应该在后端配置Multer。我遇到了同样的问题,我通过配置 Multer

解决了它