2011
11/11
Express で JSONP をスマートにレスポンスする方法
Express にて JSONP をレスポンスする時、今まではこんなふうにやっていました。
app.get('/awesome/your/api', function(req, res) {
var response = { sugar: "sweet", salt: "spicy" }
, callback = req.query.callback;
if (callback) {
// コールバックが指定されていたら JSONP をレスポンス
res.send(callback + '(' + JSON.stringify(response) + ');');
} else {
// コールバックが指定されていなければ JSON をレスポンス
res.send(response);
}
});
マニュアルにはありませんが、実はフレームワーク側で JSONP のレスポンスがサポートされています。
// res.send() にて JSONP を有効にするオプション
// GET パラメータに callback の指定があると JSONP でレスポンス
// app.config に書いておくと良さげです。
app.enable('jsonp callback');
app.get('/your/awesome/api', function(req, res) {
var response = { sugar: "sweet", salt: "spicy" };
// 設定が有効になっているのでフレームワーク側で自動で判別してくれる
res.send(response);
});
/your/awesome/api
{"sugar":"sweet","salt":"spicy"}
/your/awesome/api?callback=fn
fn({"sugar":"sweet","salt":"spicy"});
フレームワークの機能を使うと、余計な if 文を書かなくてもいい上に、危険な文字もエスケープしてくれるのでこちらを使ったほうが良いでしょう。なお、コールバック関数名を指定するパラメータ名は変更できないみたいです。
以上、ちょっとした小ネタでした。




