表达js表单数据

IT技术 javascript node.js express connect
2021-03-18 17:03:09

有人可以告诉我推荐的(最新的)方式来获取快速发布的表单数据吗?

很多教程/帖子等都在谈论 bodyParser,但这不再与 Express 捆绑在一起,其他博客等建议直接使用 urlencoded,但现在这也不可用。

我正在努力寻找有关这些框架或技术的准确信息。

顺便说一句,我感兴趣的是非常简单的小形式数据

6个回答

您应该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 正在寻找bodyParser不再属于(已弃用)express

由于问题的标题非常笼统,并且答案不包括 的所有方面form-data,我会将@StLia 的答案作为编辑。

正文解析器自述文件

由于其复杂且通常较大的性质,这不能处理多部分实体。对于多部分主体,您可能对以下module感兴趣:

是的,但它不适FormData()用于包含文件的内容。@stlia 的答案是一个很好的答案。
2021-04-21 17:03:09
在 express 4 中,现在使用: app.use(bodyParser.urlencoded({extended: true }));
2021-05-01 17:03:09
您需要提供扩展选项,因为在更高版本的 body-parser 中没有默认值
2021-05-02 17:03:09

您可以使用express-formidablemodule来做到这一点。通过以下命令安装“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));
});

单击此处了解更多说明

我也是,这对我有用,但接受的答案没有。
2021-04-29 17:03:09
@llamerr 很高兴我能帮上忙。
2021-05-01 17:03:09
也为我工作。接受的答案不适FormData()用于文件。
2021-05-05 17:03:09

来自body-parser的自述文件

由于其复杂且通常较大的性质,这不能处理多部分实体。

以上将适用于x-www-form-urlencoded并且json不适用于任何multipart. form-data也是multipart与标题multipart/form-data

在 的情况下form-data,您最好的解决方案是使用express-formidable

除了带有 的解决方案之外formidable,还有另一个module,我自 2019 年以来一直在我最近的项目中使用。moduleexpress-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将提供处理文件所需的所有相关数据,例如路径、大小、文件名等。

我注意到@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