blog.bouzuya.net

2013-11-15 express-resourceを試す

express-resourceを試す。そのメモ。

  • Node.jsではデファクトスタンダードなWebアプリケーションフレームワークexpressを拡張するライブラリ。

  • expressにresource構文を提供するexpress-resourceを試す。

  • 詳細はhttps://npmjs.org/package/express-resourceからたどるか、

  • GitHubのhttps://github.com/visionmedia/express-resourceからどうぞ。

  • resourceはRuby on Railsのconfig/routes.rbでおなじみの構文で、特定のリソースに対するCRUDを提供する。

  • express-resource が定義する routes は次の通り。

    GET / -> index GET /new -> new POST / -> create GET /:id -> show GET /:id/edit -> edit PUT /:id -> update DELETE /:id -> destroy

  • app.getapp.postでいくつも定義していたものをapp.resouceでまとめて定義してくれる。

  • さっそく試す。試した結果はbouzuya/express-resource-exampleにある。

  • npm install express-resourceなどでインストールする。

    • npmの使い方は過去記事を参照。ぼくは--saveをつけてpackage.jsonにも書いてもらう。
  • 基本はapp.resource(path, actions)

  • optionsを指定できるapp.resource(path, actions, options)

    • id optionは:idを変更できる。
      • app.resource('users', actions, { id: 'user_id' })とすれば、通常/users/:userとなるところを/users/:user_idとできる。
      • ただし、後述するAuto-Loadingが不自然になるのでおすすめしない。
    • load optionはAuto-Loading機能で、express-resourceの特徴的な機能。
      • loaderとして動作する関数を設定しておくと、req:id名でloadした値が設定される。
      • app.resource('users', actions, { load: (function(id, fn) { fn(null, users[id]); }) })とすれば、users[id]req.userで取得できる。
        • /users/:userなのでreq.userになる/users/:user_idにしているとreq.user_id になる。
  • content-negotiationはその名前の通りコンテンツを拡張子で判別して最適なものを返すための仕組み。

    • 具体的にはreq.formatで指定された拡張子を取得できる。
    • /users/1.jsonならreq.format'json'を取得できる。

個人的にはauto-loadingはどうかなあと思ってしまう。idを指定しているところをそのまま変数名に使うのもアレだし、routesで割り振った先でloadする方がつくりとして自然になる気がする。

その他はごくごく普通の動きをしているので、素直に使える。Ruby on Railsで言うところの:onlyなどはないが、関数を定義していなければroutingされないので、気にしなくて良い。Ruby on Railsのとりあえず作る動きよりはずっと自然に感じる。expressを使うなら常用しても良いかも。

ちなみにドキュメントは大して用意されていないが、テストコードは綺麗で分かりやすいのでおすすめ。上記GitHubのリンクからたどると良い。

60 min.