javascript 如何在Express js中轻松访问表单数据?

vq8itlhq  于 2023-05-12  发布在  Java
关注(0)|答案(7)|浏览(124)

我有一个非常简单和少量的表单数据的POST请求。我如何才能最容易地访问它?
许多教程/帖子等都在谈论bodyParser,但它不再与Express捆绑在一起。其他地方(博客等)建议直接使用urlencoded,但现在也不可用。
试图找到关于这些框架或技术的准确信息是我的头。
有人能告诉我推荐的(最新的)方法来获取Express中的Posted表单数据吗?

dffbzjpn

dffbzjpn1#

您应该安装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正在寻找bodyParser(已弃用),它不再是express的一部分。
由于问题的标题非常通用,并且答案不包括form-data的所有方面,我将把@StLia的答案作为编辑。
Body-Parser Readme
由于多部分实体复杂且通常较大,因此无法处理多部分实体。对于多部分实体,您可能会对以下模块感兴趣:

  • 餐馆工和接线员
  • 多方和连接多方
  • 可怕的
  • 穆特
w6mmgewl

w6mmgewl2#

你可以使用express-powerful模块。通过以下命令安装'express-worldwide'
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

hmae6n7t

hmae6n7t3#

body-parser的README:
由于多部分实体复杂且通常较大,因此无法处理多部分实体。
上面的方法适用于x-www-form-urlencodedjson,但不适用于任何multipartform-data也是multipart,头为multipart/form-data
对于form-data,最好的解决方案是使用express-formidable

6g8kf2rb

6g8kf2rb4#

正如这个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

参见:query-string vs qs

pcww981p

pcww981p5#

我注意到@HubballiHuli的答案是使用一个名为express-worldwide的软件包。你不需要使用这个不必要的包,它提供了一个(小)代码文件。相反,你可以自己做(现在删除依赖)。
下面是formidableMiddleware文件:

'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

ev7lccsx

ev7lccsx6#

除了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将提供处理文件所需的所有相关数据,如路径,大小,文件名等。

p8ekf7hl

p8ekf7hl7#

如果您希望将formidableMiddleware仅应用于一个API路由,而不是全局应用,则可以通过以下方式传递值。
这将是有用的,如果你想在不同的头之间混合传递给其他API的API,你不希望formidableMiddleware API被应用。

const express = require('express');
const formidable = require('express-formidable');

var app = express();

app.post('/mypath', formidableMiddleware(), (req, res) => {
  // rest of the code
})

相关问题