0

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

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

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

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

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

4

2 回答 2

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 来对表单提交进行任何“预飞行”。

于 2013-08-23T12:12:38.013 回答
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. 我选择使用util库中的.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)

如果您正在寻找一种合并对象的本机方式,请参阅在没有 jQuery 的情况下在 node.js 上合并或合并 JSON以了解执行此操作的方法。

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

于 2013-08-11T19:07:23.763 回答