如何使用 express.bodyParser/node-formidable 解析嵌套元素?

Posted

技术标签:

【中文标题】如何使用 express.bodyParser/node-formidable 解析嵌套元素?【英文标题】:How does one parse nested elements using 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 将它们解析成一个数组。

【问题讨论】:

【参考方案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 了解执行此操作的方法。

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

【讨论】:

以上是关于如何使用 express.bodyParser/node-formidable 解析嵌套元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?