10

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

//-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]
    );
}

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

PS 我知道如何在没有 AJAX 的情况下做到这一点

4

1 回答 1

25

对于bodyParser.urlencoded,如果将extended选项设置为true,则格式的属性名称property[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将是一个对象,如下所示:

{
  "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:如果您想知道功能样式,那么这里是:

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

编辑:特别感谢@eye_mew 指出我们需要设置extendedtrue.

于 2013-09-06T05:22:23.513 回答