快递js表单数据
Posted
技术标签:
【中文标题】快递js表单数据【英文标题】:Express js form data 【发布时间】:2014-09-08 03:30:14 【问题描述】:有人可以告诉我推荐的(最新的)以快递形式获取 POSTed 表单数据的方法。
很多教程/帖子等都在谈论 bodyParser,但它不再与 Express 捆绑在一起,其他博客等建议直接使用 urlencoded,但现在也不可用。
试图找到有关这些框架或技术的准确信息是我的头疼。
顺便说一句,我感兴趣的是非常简单和小型的数据
【问题讨论】:
这不应该被否决。对于如何读取单个 POST 参数,确实没有简单的文档。接受的解决方案使用已弃用的包。 Jeremy 我认为接受的解决方案不是弃用的包。 Mritunjay 所指的包的名称中有一个连字符,我相信它与易受攻击的“bodyparser”中间件不同。我认为在一些警告原始“bodyparser”的博客文章中提到了它。这就是为什么我同意它不应该被否决(即没有显示任何研究努力),因为我搜索了很长时间来寻找解决方案,但问题是围绕它的太多旧且令人困惑的信息正在让我头疼。跨度> 感谢您的澄清;我没有意识到 body-parser 和 bodyParser 包之间有区别。这种微妙之处是这个问题是正确问题的部分原因。 【参考方案1】:您应该安装body-parser
到npm-install
。现在它作为一个单独的中间件出现。
然后在您的 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.
)
编辑 1
上面的答案是针对特别提出的问题,OP 正在寻找不再属于 express
的 bodyParser
(deprecated)。
由于问题的标题很笼统,而且答案不包括form-data
的所有方面,我将@StLia的答案作为编辑。
Body-Parser Readme
busboy 和 connect-busboy multiparty 和 connect-multiparty formidable multer这不处理多部分实体,因为它们复杂且通常很大。对于多部分正文,您可能对以下模块感兴趣:
【讨论】:
在 express 4 中,现在使用:app.use(bodyParser.urlencoded( extended: true )); 需要提供扩展选项,因为body-parser的更高版本没有默认选项 是的,但它不适用于包含文件的FormData()
。@stlia 的答案很好。
在 express 4.16 中,body-parser 已经内置。你可以使用app.use(express.urlencoded( extended: true ));
【参考方案2】:
您可以使用 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));
);
Click here for further description
【讨论】:
@llamerr 很高兴我能帮上忙。 我也是,这对我有用,但接受的答案没有。 也为我工作。接受的答案不适用于带有文件的FormData()
。【参考方案3】:
来自body-parser的自述文件:
这不处理多部分实体,因为它们的复杂性和 通常是大型自然。
以上内容适用于x-www-form-urlencoded
和json
,但不适用于任何multipart
。 form-data
也是 multipart
,标题为 multipart/form-data
。
如果是form-data
,最好的解决方案是使用express-formidable。
【讨论】:
【参考方案4】:除了formidable
的解决方案之外,还有一个模块是我自 2019 年以来一直在我最近的项目中使用的。模块 express-form-data 可以在您的服务器文件中轻松声明,例如:
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
将提供您处理文件所需的所有相关数据,例如路径、大小、文件名等。
【讨论】:
【参考方案5】:我注意到@HubballiHuli 的答案是使用名为 express-formidable 的包。 您不需要使用这个不必要的包,它提供了一个(小)代码文件。 相反,您可以自己做(现在删除依赖项)。
这里是强大的中间件文件:
'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
【讨论】:
【参考方案6】: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
Non-deprecated alternative to body-parser in Express.js
query-string vs qs
【讨论】:
以上是关于快递js表单数据的主要内容,如果未能解决你的问题,请参考以下文章