Node.js + Express + MongoDB(mongoose) を始める

内容はほぼCreating a REST API using Node.js, Express, and MongoDB | Christophe Coenraetsのままです。
終盤での mondodb のアクセスの部分のみ元サイトと違い mongoose を使ったコードに置き換えてみました。
環境は Windows8 pro x64 です。




Node.js をインストールする

  • node.jsにて、インストールボタンをクリック。
  • ダウンロードしたインストーラを実行。インストール完了時点でパスが通っていました。
  • コマンドプロンプトで "node -v"と打ち、バージョンが返ってくることを確認しておきます。

これで Node.js の使用準備はOK。

  • 今回作業用のフォルダを作成しておきます。(以後、ルートフォルダと呼びます。)
  • ルートフォルダ内に server.js を作成します。公式にもあるおなじみのやつ。

node server.js

http://localhost:3000 にアクセスすると、"Hello, World"の文字列が返ってくることが確認できます。




Express をインストールする

ExpressはNode.jsの軽量Webアプリケーションフレームワークです。少し調べたところ、Express だと規模が大きくなると1つのファイルに色んな処理が入って管理が大変になるらしいです。
将来的にはSailsというやつがいいのかな?この辺りは今後の調査対象ということで。
では、本題に戻って。


  • ルートフォルダ内に package.json を作成します。
  • コマンドプロンプトで以下を実行し、Express をインストールします。
# プロキシ環境の場合は事前にプロキシを指定しておく
npm config set proxy http://url:port
npm install

Expressモジュールがnode_modulesのサブフォルダにインストールされます。


server.js を修正してサーバーを再起動し、Express が動作していることを確認します。

以下のアドレスにアクセスすると、それぞれの JSON が返ってくることが確認できます。

データベース内のすべてのワインを取得: http://localhost:3000/wines
特定のIDでワインを取得: http://localhost:3000/wines/1

ドメインオブジェクトの分離

ドメインオブジェクト(今回は wine)をモジュール化して server.js から分離します。

  • ルートフォルダ配下に routes フォルダを作成します。
  • routes フォルダに wines.js を作成し、server.js から wine.js を呼び出すように変更します。

  • サーバーを再起動し、前回と同様に JSON が返ってくることをブラウザで確認します。

MongoDB をインストールする

  • Downloads - MongoDBから、ダウンロードして解凍します。
  • Install MongoDB on Windowsに従ってセットアップします。
    • 解凍後にやったのは、data フォルダと data\db フォルダを用意したぐらい。
    • この状態で mongod.exe を実行しても上記フォルダが not found となったので、以下のように --dbpath オプションで場所を指定して実行しています。何故。。
E:\Users\bin\mongodb\bin\mongod.exe --dbpath "E:\Users\bin\mongodb\data"

↑を実行して、↓と出ればOK。

・・・
Wed Jul 10 15:12:29.751 [websvr] admin web console waiting for connections on port 28017
Wed Jul 10 15:12:29.751 [initandlisten] waiting for connections on port 27017

Mongoose をインストールする

  • package.json に mongoose の依存を追記し、npm でインストールします。

npm install

mongooseについては、以下のサイトを参考にしました。
Mongoose API v3.6.14
node.js + mongoose + mongodbで遊ぶ - Last Verse
node.js から MongoDB にアクセス (Mongoose の紹介) - KrdLab's blog

公式サイトの api については、model.jsでメソッド名を見てればなんとなく用途はわかります。show code をクリックすれば具体的な実装も見れます。




REST APIの実装

URIの設計は以下になります。

Method URL アクション
GET /wines すべてのワインを取り出す
GET /wines/:id 指定された_idのワインを取り出す
POST /wines 新しいワインを追加
PUT /wines/:id 指定_idのワインを更新
DELETE /wines/:id 指定された_idのワインを削除

server.js と wine.js を以下のように書き換えます。

追加削除は問題なく出来たのですが、更新の部分で少し嵌りました。findByIdAndUpdate の第2引数に更新したい Object を入れるのですが、この Object は _id の要素を持っていてはダメです。
そのため、前の行で _id 要素を delete しているわけです。参考にしていたサイトは特定の要素を指定して更新していたので、最初気付きませんでした。よく考えれば至極当然のことなのですが。

サーバーを再起動して、上記URLを踏んで確認します。
といっても、今の状態で GET 以外のメソッドを実行することは難しいですので、元サイトではcurl and libcurlを利用してコマンドで確認しています。


最後の確認まで出来ていないけど、ここまで。
元サイトや参考にしていた下記の書籍は、mondoDBのドライバを直接叩いていましたが、個人的には mongoose はAPIが分かりやすく、好みでした。

プロになるためのJavaScript入門 ~node.js、Backbone.js、HTML5、jQuery-Mobile (Software Design plus)

プロになるためのJavaScript入門 ~node.js、Backbone.js、HTML5、jQuery-Mobile (Software Design plus)