Arrays 在Express表单中处理输入数组?

Arrays 在Express表单中处理输入数组?,arrays,forms,node.js,express,Arrays,Forms,Node.js,Express,假设我必须在同一页面上编辑一批相同类型的对象: //-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='submi

假设我必须在同一页面上编辑一批相同类型的对象:

//-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')
我知道我将无法在后端处理这样的表单,因为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]
    );
}
//js

对于(
bodyParser.urlencoded
)的(var i=0;i),如果将
extended
选项设置为
true
,则
格式属性[nestedProperty]
的属性名称将由
bodyParser
中间件解释为:

{ property: nestedPropert: $value }
只需确保初始化中间件,如下所示:

app.use(bodyParser.urlencoded({ extended: true });
然后,更改上述表单声明,使message属性为对象,而不是字符串值,如下所示:

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
转换为数组:

var messages = Array.prototype.slice.call(request.body.messages);
现在,您应该能够像这样访问每个元素(注意:我更喜欢功能性样式,但我会让它与您的保持一致):


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

名称
用于以非
id
的形式发送输入数据。简单而棒极了,这就是我一直在寻找的,谢谢!没问题。我还更新了答案,使它更干净。这是真的吗在使用express 4.*之前,我尝试过类似的方法,但我的数组输入被作为字符串传递:
{'user[last_name]:'asd','user[first_name]:'asd'}
@anderirosca,也有同样的问题。通过指定
{extended:true}
选项,如:
app.use(bodyParser.urlcoded({extended:true}))修复了这个问题;
如果我像这样使用它,它就不起作用了
name='messages[][message]'
。我正在使用jquery向表单添加消息对象,但我没有索引号。
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
  });
}
messages.forEach(function (message) {
  console.log(
    'ObjectId' + message.id,
    'Message' + message.message,
    'Author' + messages.author
  );
});