处理表单中的input数组?

比方说,我必须在同一个页面上编辑一批相同types的对象:

//-jade form(action='', method='POST') for each message_id in messages_ids input(type='text', name='message', id='#{message_id}') input(type='text', name='author', id='#{message_id}') input(type='submit', value='Send') 

我知道我不能在后端处理这种forms的id的原因 – 它不会被发送到后端。 但是,有没有办法做到这一点? 我想在后端得到这样的东西:

 //js for (var i = 0; i <= req.body.message.length; i++) { console.log ( 'ObjectID: ' + req.body.message[i].id, //-? null, just to show what I'm trying to get 'Message: ' + req.body.message[i], 'Author: ' + req.body.author[i] ); } 

这是伪代码(它不会工作)。 那么,有什么想法?

PS我得到如何做到这一点,没有AJAX

对于bodyParser.urlencoded ,如果将extended选项设置为true ,那么格式property[nestedProperty]属性名称将由bodyParser中间件解释为:

 { property: nestedPropert: $value } 

只要确保像这样初始化中间件:

 app.use(bodyParser.urlencoded({ extended: true }); 

之后,更改上面的表单声明,使消息属性是一个对象,而不是一个string值,如下所示:

 form(action='', method='POST') - for (var i = 0; i < messages_ids.length; i++) - var message_id = messages_ids[i] //- so we're treating each index like a property of `message` input(type='text', name='messages[#{i}][message]') input(type='text', name='messages[{#{i}}][author]') input(type='hidden', name='messages[#{i}][id]', value='#{message_id}') input(type='submit', value='Send') 

然后,在服务器端, request.body.messages将是一个对象,如下所示:

 { "messages": { "1": { "message": $message1, "author": $author1, "id": $id1 }, "2": { "message": $message2, "author": $author2, "id": $id2 } /* , ... */ } } 

然后,您可以轻松地将request.body.messages转换为数组:

 var messages = Array.prototype.slice.call(request.body.messages); 

现在,你应该可以像这样访问每个元素(注意:我更喜欢实用的风格,但我会保持它与你的一致):

 for (var i = 0; i < messages.length; i++) { console.log({ 'ObjectId' + messages[i].id, 'Message' + messages[i].message, 'Author' + messages[i].author }); } 

PS:如果你想知道function风格,那么这里是:

 messages.forEach(function (message) { console.log( 'ObjectId' + message.id, 'Message' + message.message, 'Author' + messages.author ); }); 

编辑 :特别感谢@eye_mew指出我们需要将extended设置为true