OS Mac OS X 10.8.2
node v.0.8.3
express v3.0.3
bodyParser ミドルウェア
クライアントから express アプリケーションへ HTTP の POST メソッドでデータ送信した場合、( 正確には Content-Type が application/x-www-form-urlencodedか multipart/form-data のリクエストを送信した場合) リクエストが bodyParser ミドルウェアを経由すると、req.body オブジェクトにメッセージボディの値が追加されます。
また、メッセージボディの各パラメータ名が JavaScript のオブジェクトとして解釈できる場合は、オブジェクトにパースしてから req.body に追加してくれます。
もちろん、配列やネストしたオブジェクトでも問題なくパースしてくれます。
例として、entry というリソースを生成するフォームを jade で作成しました。
_form.jade
form(method="POST", action="/entries")
label お名前
input(type="text", name="entry[author][name]", id="entry[author][name]")
br
label タイトル
input(type="text", name="entry[title]", id="entry[title]")
br
label 本文
textarea(name="entry[body]", id="entry[body]")
br
lebel カテゴリ(複数可)
input(type="checkbox", name="entry[category][]", value="diary")
| 日記
input(type="checkbox", name="entry[category][]", value="memo")
| メモ
br
input(type="submit")
上記フォームからのリクエストが bodyParser ミドルウェアを経由すると、 req.body.entry は下記のようなオブジェクトになります。
{ entry:
{ author: { name: 'takeshi' },
title: 'test',
body: 'This is test.',
category: [ 'diary', 'memo' ]
}
}
関連性のある値をまとめることで、コードの可読性が上がるとともに、新しいオブジェクトを生成する際など、以下のような簡潔な記述が可能となります。
app.js
app.use(express.bodyParser());
var Entry = require('./models').Entry;
app.post('/entries', function(req, res){
//mongoose で Entry オブジェクトを生成
var new_entry = new Entry(req.body.entry);
new_entry.save(function(err){
res.redirect('/entries');
});
})
まとめ
- bodyParser ミドルウェアを使うと、 req.body にリクエストボディの値が追加される。
- リクエストボディのパラメータ名を JavaScript のオブジェクトとして解釈できる値にすると、オブジェクトにパースして req.body に追加してくれる。
0 件のコメント:
コメントを投稿