快递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-parsernpm-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 正在寻找不再属于 expressbodyParser(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-urlencodedjson,但不适用于任何multipartform-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表单数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有快递的情况下处理多部分/表单数据请求

js开头是啥快递

模拟京东快递单号查询

案例:模拟京东快递单号查询

案例:模拟京东快递单号查询

快递100电商快递地图轨迹推送服务API接口案例代码