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 文を書かなくてもいい上に、危険な文字もエスケープしてくれるのでこちらを使ったほうが良いでしょう。なお、コールバック関数名を指定するパラメータ名は変更できないみたいです。

以上、ちょっとした小ネタでした。

preload preload preload