req.body在20个条目后自动将数组转换为对象

时间:2016-11-10 15:38:39

标签: javascript node.js express

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

<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中,我想在forEach上执行req.body.properties但是有超过20个属性,req.body.properties以某种方式投射在ObjectforEach中函数不再存在。

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不喜欢拥有比解释更多的代码。希望这仍然可以理解。

1 个答案:

答案 0 :(得分:3)

//Compiler Directives #include<iostream> #include<cstdlib> using namespace std; //Constant Declarations const int LOWERBOUND = 400; const int UPPERBOUND = 2400; //Main Body int main(){ //Local Identifiers int year, leapCode; //Input Module cout<<"Please enter a year in the range 400 to 2400\t"; cin>>year; //Process Module if ((year >= LOWERBOUND)&& (year <= UPPERBOUND)){ if (year%4!=0) leapCode = 1; else if (year%100!=0) leapCode = 2; else if (year%400!=0) leapCode = 3; else leapCode = 4; switch(leapCode){ case 1: cout<<"The year "<<year<<" is not a leap year\n"; break; case 2: cout<<"The year "<<year<<" is a leap year\n"; break; case 3: cout<<"The year "<<year<<" is a century year but not a leap year\n"; break; case 4: cout<<"The year "<<year<<" is a leap century year"; break; } //end switch } else cout<<"The year is out of range\n"; system("PAUSE"); return 0; } (处理请求主体)使用qs库来解析URL编码数据。

该库的documentation表示关于数组:

  

qs 还会将数组中的索引限制为最大索引20.任何索引大于20的数组成员都将转换为索引为键的对象< / p>      

...

     

传递body-parser选项

可以覆盖此限制

但是,似乎没有办法将该选项传递给arrayLimitqs。但是将对象转换为数组相对容易:

body-parser