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

时间:2013-08-11 18:38:09

标签: node.js

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

我想创建一个表单,表示此处列出的每个数据元素的输入:

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

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

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

2 个答案:

答案 0 :(得分: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]"/>

请注意,方括号不平衡,这是因为&#34;错误&#34;在&#34; querystring&#34;包装(或者,至少在2013年8月20日它看起来如此)。

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

这样做的好处是它不需要任何Javascript来做任何事情&#34;预飞行&#34;表格提交。

答案 1 :(得分:0)

使用带有输入字段的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>

Formidable会解释为这个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了解相关方法。

希望这能回答这个问题并帮助你解决问题!