【问题标题】:Express js form data快递js表单数据
【发布时间】:2014-09-08 03:30:14
【问题描述】:

有人可以告诉我推荐的(最新的)以快递形式获取 POSTed 表单数据的方法。

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

试图找到有关这些框架或技术的准确信息是我的头疼。

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

【问题讨论】:

  • 这不应该被否决。对于如何读取单个 POST 参数,确实没有简单的文档。接受的解决方案使用已弃用的包。
  • Jeremy 我认为接受的解决方案不是弃用的包。 Mritunjay 所指的包的名称中有一个连字符,我相信它与易受攻击的“bodyparser”中间件不同。我认为在一些警告原始“bodyparser”的博客文章中提到了它。这就是为什么我同意它不应该被否决(即没有显示任何研究努力),因为我搜索了很长时间来寻找解决方案,但问题是围绕它的太多旧且令人困惑的信息正在让我头疼。跨度>
  • 感谢您的澄清;我没有意识到 body-parser 和 bodyParser 包之间有区别。这种微妙之处是这个问题是正确问题的部分原因。

标签: javascript node.js express connect


【解决方案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

这不处理多部分实体,因为它们复杂且通常很大。对于多部分正文,您可能对以下模块感兴趣:

【讨论】:

  • 在 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-08
          • 1970-01-01
          • 2021-06-13
          • 2020-05-01
          • 2019-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多