【问题标题】:How does one parse nested elements using express.bodyParser/node-formidable?如何使用 express.bodyParser/node-formidable 解析嵌套元素?
【发布时间】:2013-08-13 01:50:16
【问题描述】:

我正在使用 express.js 和 bodyParser 中间件(从技术上讲,它在幕后是节点强大的)。

我想创建一个表格来代表此处列出的每个数据元素的输入:

{
  "name" : "asdf",
  "children" : [
       { 
         "child_name" : "xyz1234",
         "size" : 12
       },
       { 
         "child_name" : "1234aszds"
         "size": 14
       }
      ]
 }

这里的子节点数量是动态的,但我希望能够在客户端添加其他字段,并将它们映射到服务器上的 req.body 中。

注意,我正在寻找如何在客户端中命名输入,以便原始 POST 正文具有正确的编码,从而允许 node-formidable 将它们解析成一个数组。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    实现这一点的一般方法如下(为清楚起见,排除非必要属性):

    <input name="name"/>
    <input name="children[0[child_name]"/>
    <input name="children[0[size]"/>
    <input name="children[1[child_name]"/>
    <input name="children[1[size]"/>
    

    请注意,方括号不平衡,这是必需的,因为“querystring”包中存在“错误”(或者,至少在 2013 年 8 月 20 日看起来如此)。

    但是,如果方括号不平衡,如上所述,结果是这将被解析为我原始问题中请求的对象结构(即,这将作为“req.body”提供)。

    这样做的好处是它不需要任何 Javascript 来对表单提交进行任何“预飞行”。

    【讨论】:

      【解决方案2】:

      使用带有输入字段的 HTML 表单会出现问题,因为如果不解析每个字段名称以确定其在结构中的位置,就没有简单的方法来定义结构。

      例如,如果您发布了以下内容:

      <form action="/post" method="post">
        <input type="text" name="data[name]">
        <input type="text" name="data[children][][child_name]">
        <input type="text" name="data[children][][size]">
        <input type="text" name="data[children][][child_name]">
        <input type="text" name="data[children][][size]">
        <input type="submit" value="Submit">
      </form>
      

      强大的会解释成这个 JSON 结构:

      [ [ 'data[name]', 'name' ],
        [ 'data[children][][child_name]', [ 'cname1', 'cname2' ] ],
        [ 'data[children][][size]', [ 'csize1', 'csize2' ] ] ]
      

      要以这种方式发布深层结构,我建议使用 AJAX 并改为发布完整的 JSON 对象,如下所述。

      以下内容应允许您将所有字段直接复制到req.body。我选择使用 utile 库中的 .mixin() 助手。

      var utile = require('utile')
      
      var form = new formidable.IncomingForm()
        , fields = {}
      
      form
        .on('field', function (field, value) {
          fields[field] = value
        })
        .on('end', function () {
          req.body = utile.mixin(req.body, fields)
        })
      

      根据问题本身中的 JSON,您可以像这样访问您的值:

      console.log(req.body.children[0].child_name)
      

      如果您正在寻找合并对象的本机方式,请参阅Combine or merge JSON on node.js without jQuery 了解执行此操作的方法。

      希望这能回答问题并帮助您!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-28
        • 2015-03-14
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 2023-01-04
        • 2019-12-18
        相关资源
        最近更新 更多