2012年3月21日水曜日

Node.js + express + MongoDB on Heroku でアプリケーションを作成する

最近話題のNode.jsを使ってみよう!ということでアプリ作成の環境構築~Herokuへのデプロイまで、その手順を紹介します。
Node.jsとは、メリットは、という辺りについては割愛して実際作るところのみにフォーカスします。Node.jsについては幾つか批判的な記事もあり、ここも調べてみると面白いです。

・開発準備(各種インストール)
・Node.jsのインストール
Macならmacportを使うなどいろいろと手段はありますが、ここは普通に公式サイトのインストーラーを使うことをお勧めします。
というのも、Node.js本体だけでなくそのバージョン・依存パッケージを管理するNPMというツールも合わせてインストールする必要があり、この相互のバージョン関係などを考えるとめんどくさくなってくるからです。
Node.js公式サイト

公式サイトのインストーラーはNode.jsとNPMをインストールしてパスも通してくれます。便利。

・expressのインストール
ここはNPMが入ってしまえばコマンド一発で、特に難しいことはありません。

expressインストール方法

QuickStartにもあるとおり、グローバルインストールにしないとパスが通らなかったりするため、以下の手順での実行をお勧めします。
 npm install -g express
 express /tmp/foo(開発フォルダ名)
 cd /tmp/foo
 npm install -d

-gオプションをつけてインストールするとパスが通りexpressのコマンドを使えるようになります。
後は、express フォルダ名でexpressで開発を行うためのフォルダを自動的に作ってくれるので、そこに移動し、install -d でその他依存関係のある各種ツールを落として、準備完了。

・MongoDBのインストール
これも普通にインストーラーからインストールすることをお勧めします。

MongoDB公式サイト
QuickStartガイド

インストーラーを使用すれば、特に難しい点はありません。ただ、データを格納するフォルダを自作する必要がある点に注意してください。
標準以外の場所にする場合起動時にオプション指定が必要なので、面倒な場合起動スクリプトをバッチ化(Winならbat、Macならsh)しておくと開発が楽になります。

環境がMacでバッチの作り方がよくわからない、という場合は下記を参照してみてください。ここが一番分かりやすかったです。

シェルスクリプト

MacではWindowsで言うところの環境変数の設定もGUIベースではなく、コマンドから追加します(個人的には ls -a で隠しファイルを含めて表示し、.profile・.bash_profileをopenで開いて直接編集してますが・・・目に見えて編集できるので良い)

・Mongooseのインストール(オプション)
Node.jsでMongoDBを扱う場合、ライブラリがあると楽です。Mongooseはそのうちの一つになります(非同期環境で扱う場合・・・と書いてあるので、ロック等の処理もうまいことやってくれているのかもしれません)。
NPMが入ってれば、こちらもexpress同様インストールは一発です。

mongoose公式ページ

npm install mongoose
でインストール。こちらはグローバルなどは関係なく、プロジェクトのフォルダに直接ファイルを落とす形式のようだ。


・開発
開発の細かいやり方は各種サイトにいろいろ書いてあるため、ここでは知っておくと便利な点に絞って紹介します。

・ファイル分割
Node.jsで開発をやっているととかくファイルがどんどん長くなります。そのためスキーマ定義など、分割できる箇所は分割したくなってきます。
Node.jsでは require のコマンドを使用して外部スクリプトをロードすることが出来ます(指定パスは相対パス)。フォルダを指定した場合は、フォルダ直下の index.js が読み込まれるなど、少し特殊な動作をするのでそこは注意が必要。

Node.jsでのモジュール読込

・expressでのルーティング
expressでは以下のようにルーティングを行います。
 app.get('/user/:id', function(req, res){
      var userid = req.params.id;
      res.render("user",{ requestid : userid });
    });
    getの部分は、メソッド次第でpostやput、delなどに分かれる。
res.sendで単純にデータ送信、renderでviewsフォルダ内にあるjadeファイルを指定することで、データをレンダリングして送ることが出来る(要するにページ遷移する)。
※Ajaxなどで単純にデータを送りたい場合、res.contentType('json');としてres.send(jsonオブジェクト)とすればOK。

・expressでのフォーム項目とその取得
expressでは標準でjadeを使用しているので、jadeでのフォームの作成とその取得方法を紹介します。
・jadeでのフォーム
 form(action='/', method= 'POST')
   input#name(type="text" name=user[name])
   input#email(type="text" name=user[email])
   input(type="submit" value="送信")

・expressでの取得
   var userName = req.body.user.name

nameの指定でオブジェクト名[要素名]にするとjson化してくれるようだ。
事前にapp.use(express.bodyParser()); が必要だが最初から入っていたので問題なしかと。

・MongoDBの起動・終了
mongodbのbinの中にあるmongodを実行する。
 ./mongod --dbpath フォルダ名 でデータフォルダを指定可能。

終了時は、同じくbin内にあるmongoを実行して起動中のDBに接続し、以下コマンドで終了。
 use admin
 db.shutdownServer()
止まらん、という場合はdb.shutdownServer({force : true})で強制終了。

・MongoDBでのデータベース作成・データ検索
まず use データベース名 でデータベースへ移動。MongoDBはデータベースがないけど指定された場合勝手に作ってくれるというフリーダムな仕様なので、特に作成コマンドはないのだ。
ユーザーは、ユーザーを使いたいデータベースに移動した後以下のコマンドで追加する。
 db.addUser(username,password)

いわゆるテーブルのような概念は、コレクションという形で表現される(mongooseで作成するSchemaはこのコレクションと一致する)。DB内のコレクションの一覧は以下コマンドで取得可能。
 show collections

コレクション内のデータは以下コマンドで参照できる。
db.コレクション名.find()
findにはフィルタの引数などを渡すことが可能。find({username:"john"}, {email:true})ならば、usernameがjohnで表示するオブジェクト(いわゆる列)はemailのみ、という形で指定できる。第一引数がフィルタ、第二引数が選択オブジェクトという形で機能する。

MongoDBチュートリアル


・Herokuへのデプロイ
Herokuへの基本的なデプロイの仕方は以下を参照してください。英語ですが一番最新で分かりやすいと思います。
Getting Started with Heroku
Heroku公式 Node.js関連ページ

なお、既に入っている場合念のためgem update herokuでherokuを更新しておいたほうがいいようです。また、デプロイに当たってはSSHキーの作成と登録が必要なので、こちらも参照ください。

Deploying with Git
Managing Your SSH Keys

  この辺りは結構ハマりました・・・。ここは結局公式のドキュメント見るのが一番分かりやすく正確、だったのでうまくいかない場合はHerokuサイト内での検索をお勧めします。

デプロイ時には、依存ライブラリと稼動プロセス?を管理するため、アプリケーションフォルダの直下に以下のファイルが必要です。

・package.json
依存ライブラリを記載します。npm list で依存関係を確認できるので、それを元に追加します。また、このファイルは稼動するNode.js/NPM本体のバージョン宣言も兼ねています。下記のサンプルを参考にしてください(Node.jsのバージョンを指定しないと思わぬエラーが出てハマります)。

{
   "name": "myapp",
   "version": "0.0.1",
   "engines": {
     "node": "0.6.x",
     "npm":  "1.0.x"
   },
   "dependencies": {
     "express": "2.2.0"
   }
 }


・Procfile
プロセスを稼動させるためのコマンドを書いておくファイル。以下でOK。
web: node web.js
※web.jsの部分は必要に応じて変更

・.gitignore
必須ではないですが、ライブラリ系のモジュールについて管理対象からはずします。
 node_modules


なお、Node.jsアプリはHerokuへデプロイしてもそのままでは動かないため、以下のコマンドを打つ必要があります。これは最初の一回だけで、後のデプロイでの実行は不要です。
  heroku ps:scale web=1

デプロイ後、名前を間違ってしまったなどでアプリを削除したい場合はこちらを参照。
herokuを始めてつまったところメモ

Heroku上では heroku logs でログを確認できます。デプロイが何かしらうまくいかない場合ここを参照します。

今回はMongoDBを使用しているので、MongoHQかMongoLabのアドオンを追加する必要があります。無料ですがクレジットカードの登録は必要になります。
接続文字列などはサーバー上のものにあわせる必要があるため、プログラム中では環境変数を使用する必要があります(環境変数は heroku config で確認可能)。
その辺りはこちらをご参照ください。

herokuでNode.jsを使ってchatアプリ その3(MongoDBを利用して、メッセージを永続化)

必要なポイントとしては以下になります(アドオン追加は画面からやった方が楽かも)。

・ポート番号
var port = process.env.PORT || 3000;


・接続文字列(MONGOHQの場合)
var uri = process.env.MONGOHQ_URL || 'mongodb://localhost/mongo_data';
※ユーザー名/パスワードを指定する場合以下のような感じ
'mongodb://username:password@localhost/sample'


これでアプリケーションは動いている!はずです。githubにアプリケーションのコードを上げておきましたので、実際のコードで確認したい場合はご参照ください。

スケジュール調整アプリ

0 件のコメント:

コメントを投稿