我有一个POST请求,其中包含非常简单和少量的表单数据。我最容易获取它的方法是什么?
许多教程/文章等等都谈到了bodyParser
,但这已不再与Express捆绑在一起。其他地方(博客等)建议直接使用urlencoded
,但现在这也不可用。
试图找到有关这些框架或技术的准确信息正在困扰我。
请问有人可以告诉我在Express中获取已发布表单数据的推荐(最新)方法是什么?
我有一个POST请求,其中包含非常简单和少量的表单数据。我最容易获取它的方法是什么?
许多教程/文章等等都谈到了bodyParser
,但这已不再与Express捆绑在一起。其他地方(博客等)建议直接使用urlencoded
,但现在这也不可用。
试图找到有关这些框架或技术的准确信息正在困扰我。
请问有人可以告诉我在Express中获取已发布表单数据的推荐(最新)方法是什么?
你应该通过npm-install
安装body-parser
。现在它作为单独的中间件提供。
之后在你的app.js文件中添加以下代码:
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
// in latest body-parser use like below.
app.use(bodyParser.urlencoded({ extended: true }));
它将post
请求解析为一个object
。您可以在req.body
中获取您的变量。
在您的post
请求处理程序中。
app.post('/post',function(request,response){
console.log(request.body) //you will get your data in this as object.
})
上面的答案是针对特定问题提出的,OP正在寻找已经不再是express
的一部分的bodyParser
(已弃用)。
由于问题的标题非常通用,而答案并不包括所有form-data
的方面,因此我将把@StLia的答案作为编辑。
这不处理多部分主体,因为它们通常很复杂且通常很大。 对于多部分主体,您可能会对以下模块感兴趣:
FormData()
一起使用。@stlia的回答很好。 - Alexander Kimapp.use(express.urlencoded({ extended: true }))
。 - Moritz您可以使用 express-formidable 模块来实现这一点。 通过以下命令安装 'express-formidable'
npm install 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
res.send(JSON.stringify(req.fields));
});
FormData()
时没有起作用。 - DileepNimantha从body-parser的README中:
由于其复杂且通常较大的特性,它不处理多部分体。
以上将适用于x-www-form-urlencoded
和json
,但不会使用任何multipart
。 form-data
也是具有标题multipart/form-data
的multipart
。
对于form-data
,您最好使用express-formidable。
正如这个StackOverflow回答所述:
Express 4.16+已经实现了他们自己的版本的body-parser,因此您不需要将其添加到项目中。您可以在express中本地运行它
app.use(express.json()); // Used to parse JSON bodies
app.use(express.urlencoded()); // Parse URL-encoded bodies using query-string library
// or
app.use(express.urlencoded({ extended: true })); // Parse URL-encoded bodies using qs library
'use strict';
const formidable = require('formidable');
function parse(opts, events) {
return (req, res, next) => {
if (req.express_formidable && req.express_formidable.parsed) {
next();
return;
}
const form = new formidable.IncomingForm();
Object.assign(form, opts);
let manageOnError = false;
if (events) {
events.forEach((e) => {
manageOnError = manageOnError || e.event === 'error';
form.on(e.event, (...parameters) => { e.action(req, res, next, ...parameters); });
});
}
if (!manageOnError) {
form.on('error', (err) => {
next(err);
});
}
form.parse(req, (err, fields, files) => {
if (err) {
next(err);
return;
}
Object.assign(req, { fields, files, express_formidable: { parsed: true } });
next();
});
};
}
module.exports = parse;
exports.parse = parse;
现在来介绍如何使用它:
const express = require('express');
const formidableMiddleware = require('./formidableMiddleware.js');
var app = express();
app.use(formidableMiddleware());
app.post('/upload', (req, res) => {
//req.fields contains non-file fields
//req.files contains files
res.send(JSON.stringify(req.fields));
});
我之前写过一篇关于不必要软件包的文章,说明了为什么应该避免使用它们: https://medium.com/@alexjamesdunlop/unnecessary-packages-b3623219d86
const express = require('express');
const formData = require('express-form-data');
app.use(formData.parse());
app.post('/image-upload', (req, res) => {
console.log(req.files);
})
...
例如,在上传图片的情况下,req.files
将提供处理文件所需的所有相关数据,如路径、大小、文件名等。
const express = require('express');
const formidable = require('express-formidable');
var app = express();
app.post('/mypath', formidableMiddleware(), (req, res) => {
// rest of the code
})
req.fields
访问表单数据字段。 - henrykodev