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)
- 作者: 河村嘉之,川尻剛
- 出版社/メーカー: 技術評論社
- 発売日: 2012/12/07
- メディア: 大型本
- 購入: 4人 クリック: 1,144回
- この商品を含むブログ (7件) を見る