NodeJS Express body-解析器req.带有formdata的body是空对象

zwghvu4y  于 2023-06-29  发布在  Node.js
关注(0)|答案(6)|浏览(177)

不知怎的,我的身体总是空的,也许你有一个想法:
下面是我的服务器代码:

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 也一样:

我不明白...
使用postman发送x-www-form-urlencoded或在postman中发送raw (application/json)。但是在JavaScript中使用Formdata发送相同的头仍然会导致一个空对象...

7vhp5slm

7vhp5slm1#

记录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/
要通过express处理它,请使用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);
});
osh3o9ms

osh3o9ms2#

body-parser已被弃用,不再是Express的一部分。
此外,body-parser不提供解析form-data post数据的功能。
从body-parser存储库description
由于多部分实体复杂且通常较大,因此无法处理多部分实体。对于多部分实体,您可能会对以下模块感兴趣:

  • 服务员和连接服务员
  • 多方和连接多方
  • 可怕的
  • 穆特
dy2hfwbg

dy2hfwbg3#

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

同样,这篇文章是旧的,所以你可能已经修复了它。

q8l4jmvw

q8l4jmvw4#

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

6jjcrrmo

6jjcrrmo5#

使用multer,但我想提一下,强大也可以用于此。理想情况下,这应该是一个快速的中间件。

import formidable, { Fields } from 'formidable';

function getFormData(request: express.Request): Promise<Fields> {
    const form = new formidable.IncomingForm();
    return new Promise((resolve, reject) => {
        form.parse(request, function(error: Error, fields: Fields) {
            if (error !== null) {
                reject(error);
            }

            resolve(fields);
        })
    });
}

app.post('/foo', async (request: express.Request, response: express.Response): Promise<void> => {
    const formData = await getFormData(request);
    // ...
});
k5hmc34c

k5hmc34c6#

Express和body解析器版本:

"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

相关问题