将name =“foo [1] [bar]”的表单字段作为JSON发送到Node

时间:2015-11-05 08:10:38

标签: jquery json node.js

我想通过jQuery / ajax将一个动态增长的表单作为JSON发送(POST)到NodeJs。 Node中的完美结果是像

这样的数据结构
{
servers: [
    1: {
        name: someServer,
        host: someserver.tld,
        port: 80
    },
    2: {
        name: someOtherServer,
        host: someotherserver.tld,
        port: 8080
    }
]
}

我现在尝试的是一个看似

的表格
<input name="servers[1][name]">
<input name="servers[1][host]">
<input name="servers[1][port]">

<input name="servers[2][name]">
<input name="servers[2][host]">
<input name="servers[2][port]">

然后使用JSON.stringify(form.serializeArray()

发送

然而这不起作用 - 因为Node中的主体看起来像:

body: [
   { name: 'server[0][name]', value: 'ucbuild02' },
   { name: 'server[0][host]', value: 'ucbuild02.udac.se' },
   { name: 'server[0][port]', value: '2376' },
   { name: 'server[1][name]', value: 'ucaccapp01' },
   { name: 'server[1][host]', value: 'ucaccapp01.udac.se' },
   { name: 'server[1][port]', value: '2376' },
   { name: 'server[2][name]', value: 'ucaccapp03' } 
],

这是一个问题,我如何格式化我的表单,如何序列化它,或者我如何在Node中解析它?数据以JSON格式发送 - 请求标头验证为application/json

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我知道没有内置函数可以直接执行您想要的操作,但可能的解决方案是在表单名称中使用分隔符,而不是数组表示法,如下所示:

<input name="servers-1-name">
<input name="servers-1-host">
<input name="servers-1-port">

<input name="servers-2-name">
<input name="servers-2-host">
<input name="servers-2-port">

然后遍历表单数组,拆分名称并形成js对象。

var formData = form.serializeArray();
var output = { servers: [] };
for (var x = 0, len = formData.length; x < len; x++) {
     var namePieces = formData[x].name.split('-');
     var number = parseInt(namePieces[1]);
     var name = namePieces[2];
     if (!output.servers[number]) 
        output.servers[number] = {};
     output.servers[number][name] = formData[x].value;
}
return output;