解析Post表单数据Node.js Express

19

我正在获取此表单中的表单数据

'------WebKitFormBoundarysw7YYuBGKjAewMhe\r\nContent-Disposition: form-data; name': '"a"\r\n\r\nb\r\n------WebKitFormBoundarysw7YYuBGKjAewMhe--\r\n

我正在寻找一个中间件,可以让我像这样访问表单数据:

req.body.a // -> 'b'

我已经尝试过了

var express = require('express');
var app = express();


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

// parse application/x-www-form-urlencoded 
app.use(bodyParser.urlencoded({ extended: false }))

我的实现有问题还是我没有使用正确的中间件?


1
我认为body-parser停止支持表单数据解析。他们的Github页面有替代的表单数据解析器,如busboy。 - bspates
我正在尝试使用Busboy,但我的onfield事件给了我一个字段名为"------WebKitFormBoundary10WDBTqcGz382i2e ↵Content-Disposition: form-data; name"。 - Dan Baker
bodyParser.urlencoded 用于解析 URL 编码的表单数据。你应该考虑使用 multipart/form-data 解析器。 - OGreeni
5个回答

15

起作用的工具是multiparty

app.post('/endpoint', function (req, res) {
    var form = new multiparty.Form();
    form.parse(req, function(err, fields, files) {
        // fields fields fields
    });
})

但是这个工具是用于multipart/data表单的,我只是提交text/plain表单。 - Adeel Ahmed Baloch

10

对我有效的库是express-formidable。它干净、快速,还支持多部分请求。
以下是官方文档中的代码:

安装方式如下:

npm install -S express-formidable

以下是示例用法:

const express = require('express');
const formidable = require('express-formidable');

var app = express();

app.use(formidable());

app.post('/upload', (req, res) => {
  req.fields; // contains non-file fields 
  req.files; // contains files 
});

1
如果您正在使用 multer 进行任何文件上传/下载逻辑,它也可以被使用。这是一个非常棒的工具,感谢分享! - Alexander Santos

9

上面的两个答案是正确的,但是那些方法现在已经过时了。使用multer是访问表单数据的更好方法。通过以下命令安装它:npm install multer

一些有用的 body 解析器。

Body 类型:解析器

  • form-data:multer

  • x-www-form-urlencoded:express.urlencoded()

  • raw:express.raw()

  • json:express.json()

  • text:express.text()


根据ExpressJS文档,Multer不会处理任何非多部分(multipart/form-data)的表单。 - AmirHossein Rezaei

0

-建议使用multer。
-但如果您想使用bodyParser.urlencoded,请将其转换为URLSearchParams数据类型

demonstration:-
 let fd=new FormData("id_of_form")
let sp=new URLSearchParams()
for(let [k,v]:fd.entries()) sp.append(k,v)
  • 设置头部信息 'Content-Type':'application/x-www-form-urlencoded',并将sp参数传递到请求体中。

-祝编码愉快


0
你可以使用multer包:
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer();

app.post('/submit-form', upload.none(), (req, res) => {
  // Access form data here
  const formData = req.body;
  console.log(formData);
  
  // Handle the form data
  // ...
  
  res.send('Form submitted successfully');
});

解析后的表单数据可以在req.body中获取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接