要求的事情.主体在20个条目后自动将数组转换为对象

req.body automatically cast array to object after 20 entries

本文关键字:数组 对象 转换 主体 20个      更新时间:2023-09-26

在我的表单中,我可以动态地添加任意多的属性:

<form action="">
  <div class="property">
    <label>Name : <input type="text" name="properties[1][name]"></label>
    <label>Order : <input type="text" name="properties[1][order]"></label>
    <label>Label : <input type="text" name="properties[1][label]"></label>
    <label>Type : <input type="text" name="properties[1][type]"></label>
    <label>Description : <textarea name="properties[1][description]"></textarea></label>
  </div>
  <div class="property">
    <label>Name : <input type="text" name="properties[2][name]"></label>
    <label>Order : <input type="text" name="properties[2][order]"></label>
    <label>Label : <input type="text" name="properties[2][label]"></label>
    <label>Type : <input type="text" name="properties[2][type]"></label>
    <label>Description : <textarea name="properties[2][description]"></textarea></label>
  </div>
  <div class="property">
    <label>Name : <input type="text" name="properties[3][name]"></label>
    <label>Order : <input type="text" name="properties[3][order]"></label>
    <label>Label : <input type="text" name="properties[3][label]"></label>
    <label>Type : <input type="text" name="properties[3][type]"></label>
    <label>Description : <textarea name="properties[3][description]"></textarea></label>
  </div>
  ...
</form>

在node.js中,我想在req.body.properties上做forEach,但有超过20个属性,req.body.properties以某种方式在Object中转换,forEach功能不再存在。

propUpdate: (req, res) => {
  const post = req.body;
  console.log('isArray :', Array.isArray(post.properties));
  console.log('isObject :', require('lodash').isObject(post.properties));
  console.log('properties :', post.properties);
...
}

下面是包含20个或更少属性的结果:

isArray : true
isObject : true
properties : [ { name: 'test 1',
    order: '1',
    label: 'label 1',
    type: 'type 1' },
  { name: 'test 2',
    order: '2',
    label: 'label 2',
    type: 'type 2' },
....
  { name: 'test 20',
    order: '20',
    label: 'label 20',
    type: 'type 20' } ]

并具有20多个属性:

isArray : false
isObject : true
properties : { '1' :
  { name: 'test 1',
    order: '1',
    label: 'label 1',
    type: 'type 1' },
  '2' :
  { name: 'test 2',
    order: '2',
    label: 'label 2',
    type: 'type 2' },
....
  '21' :
  { name: 'test 21',
    order: '21',
    label: 'label 21',
    type: 'type 21' } }

我想了解为什么node.js有这种行为以及如何避免它。有人能帮我吗?

PS:我不得不减少我的代码示例,因为stackoverflow不喜欢有比解释更多的代码。

body-parser(处理请求体)使用qs库解析url编码的数据。

该库的文档声明,关于数组:

qs还将限制在数组中指定索引的最大索引数为20。任何索引大于20的数组成员都将被转换为索引为键

的对象。

这个限制可以通过传递一个arrayLimit选项来覆盖

然而,似乎没有办法通过body-parser将该选项传递给qs。但是将对象转换为数组相对容易:

post.properties.length = Object.keys(post.properties).length;
let properties = Array.from(post.properties);