表达js表格数据

Dav*_*ile 46 javascript connect node.js express

有人可以告诉我建议的(最新的)方式来获取明确的POST表格数据.

如此多的教程/帖子等谈论bodyParser,但这不再与Express捆绑,其他博客等建议直接使用urlencoded,但现在这也不可用.

试图找到有关这些框架或技术的准确信息正在努力.

BTW我感兴趣的是非常简单和小型的数据

Mri*_*jay 55

你应该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 }));
Run Code Online (Sandbox Code Playgroud)

它将post请求解析为object.你将获得你的变量req.body.

在您的post请求处理程序中

app.post('/post',function(request,response){
   console.log(request.body) //you will get your data in this as object.
})
Run Code Online (Sandbox Code Playgroud)

编辑1

上面的答案是针对特别提出的问题,OP正在寻找bodyParser(已弃用)express不再是其中一部分的问题.

由于问题的标题非常通用,答案不包括所有方面form-data,我将@ StLia的答案作为编辑.

Body-Parser自述文件

由于它们复杂且通常较大,因此不能处理多部分主体.对于多部分机构,您可能对以下模块感兴趣:

  • 在express 4中,现在使用:app.use(bodyParser.urlencoded({extended:true})); (12认同)
  • 在 Express 4.16 中,现在内置了 body-parser。您可以使用 `app.use(express.urlencoded({ Extended: true }));` (3认同)
  • 是的,但它不适用于包含文件的“FormData()”。@stlia 的答案是一个很好的答案。 (2认同)

Hub*_*uli 18

你可以使用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));
});
Run Code Online (Sandbox Code Playgroud)

点击此处获取进一步说明

  • 我也是,这对我有用,但接受的答案没有。 (3认同)
  • 这个为我工作,但接受的答案不是 (2认同)

StL*_*Lia 14

body-parser的README :

由于它们复杂且通常较大,因此不能处理多部分主体.

以上将适用于x-www-form-urlencoded,json但它不适用于任何multipart.form-data也是multipart标题multipart/form-data.

在这种情况下form-data,您最好的解决方案是使用快速强大的.


rof*_*rol 7

正如 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
Run Code Online (Sandbox Code Playgroud)

另请参阅:查询字符串与 qs


Lui*_*bro 5

除了 的解决方案之外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);
})

...
Run Code Online (Sandbox Code Playgroud)

例如,在图像上传的情况下,req.files将提供处理文件所需的所有相关数据,例如路径、大小、文件名等。


Ale*_*lop 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;
Run Code Online (Sandbox Code Playgroud)

现在介绍如何使用它:

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));
});
Run Code Online (Sandbox Code Playgroud)

我不久前写了一篇关于不必要的软件包以及为什么不使用它们的文章: https://medium.com/@alexjamesdunlop/unnecessary-packages-b3623219d86