作業メモ

朝から色々云々してたんですが上手くいかず。とりあえずイチからやりなおす。とりあえず node のバージョンも 0.4.7 にして、express も入れてとか色々下準備。
Heroku への deploy は成功してたんですがちゃんと動くのを見てないので、ってのもあるし、それ以前にローカルで試験しろよ的な微妙さ加減があったりなんかしてます。facebook の認証なリダイレクトってローカルで、可能なのかどうかも確認したい。

とりあえず

express の最初の状態で動作試験を。とりあえず package.json を以下にして

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.5.0"
    , "jade": ">= 0.0.1"
    , "connect-auth": "0.4.1"
    , "expresso": "0.7.7"
  }
}

npm install した後で git 関連の諸々のナニを済ませとく。

$ npm install
(ry
expresso@0.7.7 ./node_modules/expresso 
express@2.5.0 ./node_modules/express 
├── mkdirp@0.0.7
├── qs@0.3.2
├── mime@1.2.4
└── connect@1.7.3
jade@0.17.0 ./node_modules/jade 
├── mkdirp@0.2.0
└── commander@0.2.1
connect-auth@0.4.1 ./node_modules/connect-auth 
├── openid@0.3.1
├── oauth@0.9.5
└── connect@1.7.3
$ git init
$ cat >.gitignore
node_modules
*~
$ git add .

で、一応ローカルで動作の確認を。

$ node app.js
Express server listening on port 3000 in development mode

welcome to express な出力を確認。次はこれを heroku に commit してみます。まず、仮想ホストを作るのか。

$ heroku create --stack cedar

ブラウザでも確認入れた後、git commit して push してみます。

$ git commit -m 'initial commit'
$ git remote add heroku git@heroku.com:fuga.git
fatal: remote heroku already exists.
$

を、自動で追加されるとか知らなんだ。では push を、と思ったんですが Procfile が必要ですね。

$ cat Procfile
web: node app.js
$

で、これも add して commit して

$ git add Procfile
$ git commit -m 'add Procfile'

push してみます。

$ git push heroku master

さて、どうなるか。deploy はできたんですが #80 なポートをリスンしなきゃだな。見慣れた Application Error な画面が出てます。ログも見とくか。

$ heroku logs --app fugahoge
2011-11-16T06:23:46+00:00 heroku[web.1]: Starting process with command `node app.js`
2011-11-16T06:23:47+00:00 app[web.1]: Express server listening on port 3000 in development mode
2011-11-16T06:23:47+00:00 heroku[web.1]: Error R11 (Bad bind) -> Process bound to port 3000, should be 24296 (see environment variable PORT)
2011-11-16T06:23:47+00:00 heroku[web.1]: Stopping process with SIGKILL

一部のみ、ですが。ちなみに #80 なポートに変更したらどうなるんかな。試験してみたら再度 Application Error な画面だ。ログも確認。どうやらハマッてたのはここなのかどうか。なんとなく EACCES が出てそげ。

2011-11-16T06:31:34+00:00 heroku[web.1]: Starting process with command `node app.js`
2011-11-16T06:31:35+00:00 app[web.1]: 
2011-11-16T06:31:35+00:00 app[web.1]: node.js:134
2011-11-16T06:31:35+00:00 app[web.1]:         throw e; // process.nextTick error, or 'error' event on first tick
2011-11-16T06:31:35+00:00 app[web.1]:         ^
2011-11-16T06:31:35+00:00 app[web.1]: Error: EACCES, Permission denied
2011-11-16T06:31:35+00:00 app[web.1]:     at HTTPServer._doListen (net.js:1098:5)
2011-11-16T06:31:35+00:00 app[web.1]:     at net.js:1069:14
2011-11-16T06:31:35+00:00 app[web.1]:     at Object.lookup (dns.js:153:45)
2011-11-16T06:31:35+00:00 app[web.1]:     at HTTPServer.listen (net.js:1063:20)
2011-11-16T06:31:35+00:00 app[web.1]:     at Object.<anonymous> (/app/app.js:35:5)
2011-11-16T06:31:35+00:00 app[web.1]:     at Module._compile (module.js:404:26)
2011-11-16T06:31:35+00:00 app[web.1]:     at Object..js (module.js:410:10)
2011-11-16T06:31:35+00:00 app[web.1]:     at Module.load (module.js:336:31)
2011-11-16T06:31:35+00:00 app[web.1]:     at Function._load (module.js:297:12)
2011-11-16T06:31:35+00:00 app[web.1]:     at Array.<anonymous> (module.js:423:10)
2011-11-16T06:31:35+00:00 heroku[web.1]: Process exited
2011-11-16T06:31:36+00:00 heroku[web.1]: State changed from starting to crashed

|

やっぱりか。ここの問題をなんとかすれば朝から作ってたナニも一つハードル超えれるのかどうなのか。単純に 24296 リスンせい、って話な気もするのでそうしてみるか。

[]を確認させて頂いたら

var port = process.env.PORT || 3000;
app.listen(port);

な記述が。let 好きなわしとしては以下かも。

let (port = process.env.PORT || 3000) { app.listen(port); };

でもこれだとコンパイルエラー出ますね。
とりあえず 24296 な結果を確認。多分駄目だろな。駄目でしたので再度ログを確認。というか上記の書き方使えって話だろうと思います。ポートは度毎に変わりそげ。
しかしローカルで試験あまりしてないので歴史の変遷が汚いのなんの。とは言え、無事にハロワ状態が heroku で動いた訳ですが、朝からヤッてるソレも同様な修正を入れて確認してみます。

とほほ

盛り込み直したんですがループしてるなorz
これ Heroku でも同様だと思われるんですがどうなるんだろw
で、

			if( req.isAuthenticated() ) {

な手続きはありやせんぜ旦那、てきメセジを吐いてオチてます。これは以前のナニと挙動が違うな。これは express.session を app.use しなかったのが原因らしい。追加してみて再試験。emacs 開きすぎててどれがどれだかワケワカorz
で、盛り込んでみたが挙動は変わらず。この経路を通過してなかったのだろうか、と思い (んな訳ゃないのですが)、connect-auth の example で確認してみましたがパスしとりますな。これはどうしてやれば良いものやら。

面倒なので

認証するナニだけ connect-auth のナニをパクって redirect 先を別アプリにするとかゆーのは乱暴に過ぎますかねぇ。
基本的には

  • 認証後に redirect して code が取得できる
  • redirect 先で code を使って auth_token を取得すれば良い
  • アプリ側では auth_token が空の場合は認証アプリに redirect すりゃ良い
  • logout したら auth_token 空にして Logoff な画面出せば良いか

てーことで何たるモジュール主義。
そりゃ良いとして、こーゆー解があるって早く気づけよ < 自分orz

作業は続く

とりあえず connect-auth/example をアプリ化。

  • ディレクトリ掘って
  • ファイルコピー

あと、node_modules 作れるように package.json 作りゃ良いのかな。必要そうなのは

  • connect の 1.4.3
  • connect-auth の 0.4.1
  • oauth の 0.9.4
  • openid の 0.3.1

あたりかと。以下をでっち上げて

{
  "name" : "fbAuth",
  "version" : "0.0.1",
  "private" : true,
  "dependencies" : {
      "connect": ">= 1.4.3"
     , "oauth": ">= 0.9.4"
     , "openid": "0.3.1"
  }
}

npm install するなど。

$ npm install
oauth@0.9.5 ./node_modules/oauth 
openid@0.3.1 ./node_modules/openid 
connect@1.7.3 ./node_modules/connect 
├── mime@1.2.4
└── qs@0.3.2
$

これで動かすとどうなるか。って connect-auth が無いorz
package.json に以下を追加。

     , "connect-auth": "0.4.1"

で npm install リトライ。

$ npm install
connect-auth@0.4.1 ./node_modules/connect-auth 
$

アホじゃなかろか。で、実行したら以下でオチた。

$ node app.js
Caught exception: Error: Cannot find module '../lib/events'

まだ微妙な記述がありますね。ええと、

                             logoutHandler: require('./node_modules/connect-auth/lib/events').redirectOnLogout("/")
                             }),
                      example_auth_middleware(),
                      connect.router(routes));

var port = process.env.PORT || 3000;
server.listen(port);

なカンジにして正常動作を確認しました。git に登録して heroku にも流す。

$ git init
$ cat >.gitignore
node_modules
*~
$ git add .
$ git commit -m 'initial commit'
$ heroku create --stack cedar
$ git push heroku master

次は redirect 先のナニを作らんと。

しかし

これってもの凄いパクり方だなorz
あ、Procfile 作ってないや。どうもイケマセン。追加して push して正常動作を確認。ヤッてることがヘボすぎる。
と思ったら herokuapp 上で正常動作しとらんな。さっきループさせたから bang されているのかどうかorz

2011-11-16T09:52:33+00:00 heroku[router]: Error H99 (Platform error)

ってのは platform 側らしいのでとりあえず帰ろう。