趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • heroku+node.jsでHello Worldしてみた(1)

    投稿日 2015年 7月 24日 コメントはありません

    ずいぶん前から話題になっている heroku を試してみました。今回は、herokuとnode.jsを使ってHello Worldしてみましたので、その記録です。
    JavaScriptを使うのもほぼ初めて、herokuも初めて、当然Node.jsも初めて、という初めてづくしなのでおかしなところもあるかもしれません。環境はLinuxMint17.1 32bitです。

    参考にしたのは「2013-07-07 herokuでNode.jsの動く環境構築してみた!」です。基本的には(2)まではこの記事を辿っただけです。(途中からNode.js + Express環境前提での記載になります)

    1.herokuのアカウント作成&準備

    herokuのサイトでサインアップします。お決まりのメールアドレスをIDとするタイプです。
    メールアドレスをIDとして入力すると、そのアドレスに確認用のリンクアドレス付きのメールが送られてきます。そこにアクセスしてパスワードを設定します。

    パスワード設定後、ログインすると、どの言語を使うか(Getting Started with Heroku)聞いてきます。

    Screenshot-1000

    今回はNode.jsを選択してみます。

    Screenshot-1001

    Node.jsとnpmがインストールされていることが条件のようですので、ここで一旦herokuから離れます。

    2.node.jsとnpmのインストール

    すでにnodejsコマンドとnpmコマンドはインストール済みなので割愛。
    デフォルトで入っているアマチュアパケット無線用のnodeパッケージを削除(中身はないようだけど)して、node.jsをインストールします。

    $ sudo apt-get --purge remove node
    $ sudo apt-get --purge remove nodejs
    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs
    $ nodejs -v
    v0.10.37
    $ node -v
    v0.10.37

    無事にインストールできたようです。

    3.heroku toolbeltのインストール

    「Getting Started with Node.js on Heroku」のSet upのところで、heroku toolbeltのインストールをします。Debian/Ubuntuを選ぶと、コマンドラインで以下を実行するよう表示されます。

    Screenshot-1002

    Rubyがインストールされている必要があるようですので、以下の通りコンソールから入力します。

    $ sudo apt-get install ruby

    とした後、

    $ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

    としてインストールします。

    4.herokuにログイン

    ~/heroku $ heroku login
    Enter your Heroku credentials.
    Email: xxxxxxxxxx@xxxxxx.xxx
    Password (typing will be hidden): 
    Authentication successful.
    ~/heroku $

    問題なく成功したので、Set upのところの「I have installed the Toolbelt」をクリックします。すると次の「Prepare the app」に進みます。

    5.サンプルアプリを動かす

    Getting Started with Node.js on Heroku」の「Prepare the app」「Deploy the app」「View logs」に沿って操作していけばサンプルアプリは容易に動きます。
    詳細は省略。その後の説明は、

    • ログは「$ heroku logs –tail」で確認可能
    • Procfileにはアプリを起動するためのコマンドを記述する。プロセスタイプの「web」に続いて、node.jsの場合には「node ファイル名.js」。webはherokuのHTTPルーティングスタックを使うためのもので、デプロイされた時にWebトラフィックを受信する、ということみたい。
    • package.jsonにはアプリケーションの依存関係を記述する。ファイルは「$ npm init」で作成できる。packages.jsonはアプリケーションのherokuで動かす際のNode.jsのバージョンと、アプリケーションの依存関係の両方を決定する。アプリケーションがデプロイされると、herokuはpackages.jsonを読み込んでnpm installコマンドを使って適切なバージョンのnode.jsと依存ファイルをインストールする。
    • アプリケーションをローカルで動かすためには「$ foreman start web」とするが、LinutMint17.1では「node」コマンドはアマチュアパケット無線用のNodeとなっており、node.jsは「nodejs」コマンドで起動することになっているため失敗してしまう。.bashrcに「alias node nodejs」と記述して新しいterminalで起動してもダメ。「$ sudo ln -s nodejs node」としてからだと、
      ~/heroku/node-js-getting-started $ foreman start web
      11:04:52 web.1  | started with pid 10609
      11:04:52 web.1  | 
      11:04:52 web.1  | /home/xxx/heroku/node-js-getting-started/index.js:2
      11:04:52 web.1  | var app = express();
      11:04:52 web.1  |           ^
      11:04:52 web.1  | TypeError: object is not a function
      11:04:52 web.1  |     at Object.<anonymous> (/home/xxx/heroku/node-js-getting-started/index.js:2:11)
      11:04:52 web.1  |     at Module._compile (module.js:456:26)
      11:04:52 web.1  |     at Object.Module._extensions..js (module.js:474:10)
      11:04:52 web.1  |     at Module.load (module.js:356:32)
      11:04:52 web.1  |     at Function.Module._load (module.js:312:12)
      11:04:52 web.1  |     at Function.Module.runMain (module.js:497:10)
      11:04:52 web.1  |     at startup (node.js:119:16)
      11:04:52 web.1  |     at node.js:902:3
      11:04:52 web.1  | exited with code 8
      11:04:52 system | sending SIGTERM to all processes
      ~/heroku/node-js-getting-started $

      となってやはりうまくいかない。
      ぐぐるさんに聞いてみると・・・同じ課題の人がいるようです。前の方の「2.node.jsとnpmのインストール」を修正しました。
      改めて試してみましたが、

      ~/heroku/node-js-getting-started $ foreman start web
      11:24:13 web.1  | started with pid 14932
      11:24:13 web.1  | 
      11:24:13 web.1  | module.js:340
      11:24:13 web.1  |     throw err;
      11:24:13 web.1  |           ^
      11:24:13 web.1  | Error: Cannot find module 'express'
      11:24:13 web.1  |     at Function.Module._resolveFilename (module.js:338:15)
      11:24:13 web.1  |     at Function.Module._load (module.js:280:25)
      11:24:13 web.1  |     at Module.require (module.js:364:17)
      11:24:13 web.1  |     at require (module.js:380:17)
      11:24:13 web.1  |     at Object.<anonymous> (/home/tom/heroku/node-js-getting-started/index.js:1:77)
      11:24:13 web.1  |     at Module._compile (module.js:456:26)
      11:24:13 web.1  |     at Object.Module._extensions..js (module.js:474:10)
      11:24:13 web.1  |     at Module.load (module.js:356:32)
      11:24:13 web.1  |     at Function.Module._load (module.js:312:12)
      11:24:13 web.1  |     at Function.Module.runMain (module.js:497:10)
      11:24:13 web.1  | exited with code 8
      11:24:13 system | sending SIGTERM to all processes
      ~/heroku/node-js-getting-started $

      となってうまくいきません。(気を取り直して再起動すると、Synapticがherokuとheroku-toolbeltのアップデートを要求してきましたが、その後でもやはりダメ・・・)
      「$ npm install」したあと「$ npm init」で package.json を作りなおしたらうまくいった模様。

    • その他、herokuの外のサービスとして長大なログを取るもの、コンソール起動の仕方(ワンライナーを動かすなど)、環境変数の渡し方・取得の方法、データベースの使い方などの記載があります。

    (2)へ続きます。