Javascript NodeJS+;用Ajax表达

Javascript NodeJS+;用Ajax表达,javascript,jquery,ajax,node.js,express,Javascript,Jquery,Ajax,Node.js,Express,我正在编写一个web实用程序,它通过Ajax提交一个文件和一些表单字段。我的表单中有一部分是动态的,因为对于同一个值,它可以有多行。用户可以添加任意数量的行。表单还接收一个文件 HTML最终会产生以下效果: <form id="main-form"> <input name="inputField[0]" type="text"></input> <input name="inputField[1]" type="text">

我正在编写一个web实用程序,它通过Ajax提交一个文件和一些表单字段。我的表单中有一部分是动态的,因为对于同一个值,它可以有多行。用户可以添加任意数量的行。表单还接收一个文件

HTML最终会产生以下效果:

<form id="main-form">
    <input  name="inputField[0]" type="text"></input>
    <input  name="inputField[1]" type="text"></input>
    <input  name="inputField[2]" type="text"></input>
    <input  name="inputField[3]" type="text"></input>
    ....
    <input  name="inputField[i]" type="text"></input>
    <input type = "file" name="file></input>
</form>
问题就在这里。我现在陷入了一种两难境地。通过Ajax传递文件的推荐方法是使用FormData对象。问题是我无法让FormData与我的数组配合。当NodeJS服务器作为FormData对象接收Ajax提交时,它不能很好地处理表单数组。它将它们视为单独的输入字段,如(console.log(request.body)):

其中,.serialize()方法为我提供了一个很好的数组,如:

{ normalField: 'normalResult',
  inputField: 
   [ 'test1',
     'test2',
     'test3',
     'test4' ]
}
但是.serialize()不适用于文件提交

所以,我想知道支持这一点的最佳方式是什么。我的要求是表单在提交时不能离开页面,所以我觉得Ajax是正确的选择


FormData是否有任何方法可以很好地与输入数组和NodeJS Express配合使用?或者为此做些什么?当.serialize()做得这么好时,我真的不想做一些字符串欺骗。

也许不是您想要的答案,但我认为它可能会解决您的问题:

只需更改您在服务器上接收的对象:

{ 
  'inputField[0]': 'test0',
  'inputField[1]': 'test1',
  'inputField[2]': 'test2',
  'inputField[3]': 'test3',
 }
您想要的(mainForm是从客户端发送的对象的名称):

数组inputField现在包含正确格式的值(console.log(inputField)):


Fiddle:

看起来您正在使用jQuery,因此我建议使用以下插件:

  • 只需包括:

  • 使用以下方法:

    • $('#main form').ajaxForm(function(){

  • 查看链接了解更多详细信息

    我尝试了类似的方法,但很奇怪。客户端,看起来一切都会很好,但当它最终提交到NodeJS服务器端时,它只显示inputField的最后一个条目,而不是数组。现在,服务器端,我只是手动提取字符串的索引“inputField[i]”,并将其放入数组中。
    { normalField: 'normalResult',
      inputField: 
       [ 'test1',
         'test2',
         'test3',
         'test4' ]
    }
    
    { 
      'inputField[0]': 'test0',
      'inputField[1]': 'test1',
      'inputField[2]': 'test2',
      'inputField[3]': 'test3',
     }
    
    var inputField = [];
    
    for (var val in mainForm) {
      inputField.push(mainForm[val]);
    }
    
    ['test0', 'test1', 'test2', 'test3'];