2013-09-06 21 views
9

のは、私は同じページに同じ型のオブジェクトの一括編集するとしましょう:私はIDの原因」バックエンドで、このようなフォームを処理することができる習慣を知っている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='submit', value='Send') 

を - それは文句を言わない送られますバックエンドにしかし、それを行う方法はありますか?私はバックエンドでこのようなものを取得したいと考えています。

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

これは擬似コードです(動作しません)。だから、どんなアイデアですか?

P.S.ただ、可能

{ property: nestedPropert: $value } 

:私はあなたがproperty[nestedProperty]としてbodyParserミドルウェアによって解釈される形式の名前を、trueextendedオプションを設定する属性場合、bodyParser.urlencodedについてAJAX

+0

'name'は入力データを' id'以外の形式で送るために使われます。 – user568109

答えて

18

せずにこれを行う方法を取得していますメッセージプロパティは、オブジェクトである持っているために、上記フォームの宣言の代わりに文字列を変更し、その後

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

:そうようなミドルウェアを初期化してください値が、そのような:

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

編集:特別な感謝は、私たちがextendedを設定する必要があることを指摘し@eye_mewしますtrue

+1

シンプルで素晴らしい、それは私が探していたものです、ありがとう! – f1nn

+1

問題ありません。私はそれをよりきれいにするための答えも更新しました。 –

+5

これはexpress 4. *でも引き続き動作しますか?私は同様のアプローチを試みましたが、配列の入力は文字列として渡されます: '{'user [last_name]': 'asd'、 'user [first_name]': 'asd'} ' –

関連する問題