node.jsでFacebookアプリの開発を始める

FacebookのGraph APIやOpen Graphをもっと触っておこうというのが趣旨です。

なんでnode.jsを選んだか

根拠はありません。イベント駆動モデルということで、1インスタンスでのスループットRailsより高いのかなと思ったからです。
加えて、触ったことがない技術をいくつか触れるからという理由もあります。

環境はHeroku

収益を上げられるわけでもなく、利用も見込めない(herokuドメインSSL証明書を使うので自分以外は使いたくないはず)ので、Herokuの無料で使える範囲に収めたら良いと思っています。

  • Dyno x 1
  • Worker x 0
  • Cron /Day
  • MongoLab (240MB)

MongoLabだけ無料で使える容量が飛び抜けて大きいのが気になっています。なぜでしょうね?

MongoDB

これは、Herokuでそれなりの容量をもらえる無料ストレージがMongoDBだったという理由以外にありません。
敢えて言うなら、こういう場合でもない限り触る機会もなさそうだからということもあります。

node.js用にはmongooseを選択。他に選択肢があるのかは知りません。

Facebook

ひとまず、認証用にeveryauthを選択しました。connect-authやmongoose-authという選択肢もあるようです。

  • mongoose-auth
    • everyauthをMongoDBと一緒に使う場合に便利だとか
    • everyauthどころかnode.jsでいっぱいいっぱいなのに、さらにややこしくしないでくれ、ということで採用見送り
  • connect-auth
    • connectってなんだ、expressでこい、という超上から目線でマニュアルを求めた結果採用見送り

近況

  • node.js インストール
  • npm インストール
  • package.json 把握(HerokuでGemfile的な扱い)
  • mongoose経由でMongoDBを使ってみた
  • mongooseを使ったモデル定義を外部ファイルに切り出してみた
  • mongooseのfind系で躓いた
    • node.jsのイベント駆動モデルに慣れず、コールバック(非同期処理)で考える癖がついてない
    • findOneが結果を戻り値を返さないことにも手間取った
      • コールバック(クロージャ)で外側のローカル変数を共有して代入する方法でごまかしてる
    • そもそもCommonJSを把握してないので、Promiseとかなんとなくで使っているからフワフワする
  • everyauthでFacebook認証を実現してみた
    • node.jsかexpressのミドルウェアの仕組みを正しく理解してないため、ミドルウェアの挿入位置次第でうまく動かないことに中々気づけなかった
      • 順番次第でrequest.session.authがセットされずにrequest.userの準備が行われないことがある(findUserByIdがよばれない)

とにかく、「動けば良いや」の精神でドキュメントは読みつつ、あまり深入りせずに実装をトライ&エラーですすめています。