久々にプロジェクトに変更を加えてherokuにアップしたらエラーに見舞われた

     以前記事にも書きましたが、公開したandroidアプリランキング表示用のサイトで使用しているGoogle AnalyticsのトラッキングIDが間違えていたので1、トラッキングID(UA-XXXXXXXX-X)だけ書き換えて heroku にアップロードしたらエラーが出てランキング表示機能が使えなくなりました。全然プログラムコードと関係ない文字列を書き換えただけなのにです。
     Node.jsは最近はほとんど触ってなかったので何をどうすればいいのかすっかり忘れていたため復旧に手間取ったので顛末を記事にしておきます。本来はプロジェクト全体を網羅したドキュメントを残すべきでしょうけど…。

    原因不明?

     herokuのログには

    Error: Most middleware (like errorHandler) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
    

    と出ていました。この時点ではよくわからなかったのですが、どうやらheroku上で実行モジュールをビルドする際に、何か仕様が変更されたパッケージを組み込んだためにエラーが発生したようです。とりあえずメッセージに沿って作業しました。

    エラーの対処

    指定されたリンク先に書いてある通りapp.jsを書き換えます。

    //app.js変更前
    if ('production' == app.get('env')) {
        app.use(express.errorHandler());
    }
    
    //app.js変更後
    var errorhandler = require('errorhandler');
    
    if ('production' == app.get('env')) {
        app.use(errorhandler());
    }
    

     herokuにpushした後、自分のスマホからアクセスしてみるとまだランキングが表示されません。herokuのログは以下です。

    Error: Cannot find module 'errorhandler'
    

     そこで、まずローカル環境で動作させようとしてnode app.jsとコマンドを打つと今度は以下のエラー

    Error: Cannot find module 'express'
    

     よくあることですが、どんどん解決すべき問題がスタックに積み上げられて増えていきます。
    Googleで検索したところ、上記エラーはnpm link expressと打つことで解決しました。
     で、再度node app.jsと打つと

    Error: Cannot find module 'errorhandler'
    

     目出度くherokuと同じエラーがローカル環境で再現しました。そしてnpm install errorhandlerを実行した後、再度node appを実行すると無事にNodeが起動しました。でもこれをheroku上で実現するのはどうするのか?と一瞬考えた後、package.jsonというファイルで管理していたことを思い出し、以下のように一行書き加えました。

    {
    //変更前
      , "dependencies": {
          "express": "4.12.1"
        , "jade": ">= 0.0.1"
        , "less-middleware": "*"
        , "mongodb": "2.0.27"
      },
    }
    
    
    {
    //変更後
      , "dependencies": {
          "express": "4.12.1"
        , "jade": ">= 0.0.1"
        , "less-middleware": "*"
        , "mongodb": "2.0.27"
        , "errorhandler": ">=1.4.3"
      },
    }
    
    

     これをherokuにpushしたところ無事にランキング表示機能が動作しました。

    ランキング表示画面

    エラーの原因

     それにしてもソースファイルの文字列リテラルを書き換えただけでなぜ動かなくなったのか?使用するパッケージのバージョンは〜以上と指定していることが多いので、それが影響したのかと思っていたのですが、Expressのバージョンは"express": "4.12.1"となっており、リビジョン番号まで指定されています。
     どうやら.gitignoreファイルが以下のようになっていて

    #.gitignore変更前
    *.log
    node_modules
    

     node_modulesディレクトリ以下のファイルがgitの管理下に入っていたのがよくなかったようです。’node_module’行の最後にスラッシュが無いので、gitにディレクトリと判断されずnode_modulesディレクトリ以下のファイルがいつの間にか勝手に差し替えられてしまったようです。

    #.gitignore変更後
    *.log
    node_modules/
    

     以下のようにnode_modules以下のファイルをインデックスから削除してようやく作業完了です。

    git rm -r --cached node_modules
    git commit -av
    git push origin
    

    1. androidアプリのAdMobとGoogle Adsenseを別々のgmailアドレスで利用しようとしたらエラーに見舞われて、それ以来ずっと放ったらかしにしていたのでした。