在节点中形成元素数组键并表达

lew*_*wis 6 javascript forms node.js express

尽管我尽了最大的努力,但我仍然坚持获取提交给 NodeJS 和 Express 的表单元素的数组键以及把手。

我的表单元素如下所示:

{{#each block}}
<input type='text' name='block_payout[{{id}}]' />
{{/each}
Run Code Online (Sandbox Code Playgroud)

这会在浏览器中产生以下标记:

<input type='text' name='block_payout[14]' />
<input type='text' name='block_payout[15]' />
<input type='text' name='block_payout[16]' />
Run Code Online (Sandbox Code Playgroud)

在 PHP 中,这将导致一个数组作为 $_POST 数组的一个元素:

$_POST [
  block_payout [
    14 => value1
    15 => value2
    16 => value3
  ]
]
Run Code Online (Sandbox Code Playgroud)

然而,Node/Express 中的 req.body 属性删除了这些键并创建了一个索引数组:

req.body [
  block_payout [
    0 => value1
    1 => value2
    2 => value3
  ]
]
Run Code Online (Sandbox Code Playgroud)

由于我想使用密钥将提交的值与其他值联系起来,这对我来说是一个大问题。有谁知道如何使用正确的密钥获取提交的表单数据?

Tim*_*per 6

当身体解析器只看到数字键时,它似乎使用一个数组(它必须从索引 0 开始),当至少有一个非数字键时使用一个对象。考虑到这一点,您可以尝试以下方法之一:

  1. 使用隐藏的表单输入来强制在数组上使用对象。例子:

    <input type='hidden' name='block_payout[null]' />
    <input type='text' name='block_payout[14]' />
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    结果如下:

    { block_payout: { '14': 'test1', '15': 'test2', '16': 'test3', null: '' } }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用非数字字符作为键前缀以强制对象映射。例子:

    <input type='text' name='block_payout[i14]' />
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    结果如下:

    { block_payout: { i14: 'test1', i15: 'test2', i16: 'test3' } }
    
    Run Code Online (Sandbox Code Playgroud)