はじめに
自分の覚書としてこの記事を書きます。
ExpressやMongoDBをインストールするところから、レシピを作成・取得などできるシンプルなWeb APIを作りました。執筆時点でWebページは作っていません。
ここではExpress Application Generatorを使ったのですが、Web APIだけを作りたいのなら自分の手で一から作っても良いかもしれません。
完成版ソースコード
参考
以下を大変参考にさせていただきました。
本題
Expressアプリの骨組みを作る
Express Application Generatorをインストール
$ npm install express-generator -g
Express Application Generatorで骨組みを作る
$ cd <適当なディレクトリ>
$ express --view=pug <アプリの名前>
$ cd <アプリの名前>
$ npm install && npm start
ブラウザで確認
http://localhost:3000や http://localhost:3000/usersにシンプルな画面ができています。
ソースコードを解釈→WebAPIに変更
http://localhost:3000表示には以下のコード(抜粋)が関係していそうだとわかります。
var app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
var index = require('./routes/index');
app.use('/', index);
var router = express.Router();
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router
extends layout
block content
h1= title
p Welcome to #{title}
app.use
がルートパスと router
を紐づけ
→ router.get
でルートパスへのGETリクエストに対する挙動を指定
→ res.render
でviewとその中で使用できるローカル変数を指定
→ views/index.pug
を表示
となっているようです。
res.render
ではなく、以下のようにres.json
を使うと固定のJSONを返すWeb APIに変化します!
var router = express.Router();
router.get('/', function(req, res, next) {
res.json({
recipes: [
{title: 'nikujaga', content: 'niku + jaga'},
{title: 'curry', content: 'veggie + curry cube'}
]
});
});
module.exports = router
MongoDBを使ってみる
MongoDB Community Serverをダウンロード&インストール
インストールが完了したら、PATHに C:\Program Files\MongoDB\Server\3.0\bin
を追加します (バージョンが異なる可能性があるので注意)。
コマンドが使えることを確認
$ mongod --version
$ mongo --version
-
mongod
:MongoDBサーバ起動用コマンド -
mongo
:MongoDBシェル起動用のコマンド
MongoDBサーバの起動設定(参考:Configuration File Options)
MongoDBサーバの起動にはDBのデータやログの格納場所を指定する必要があります。
今回は以下のように設定ファイルに設定してみます。(※パスは適宜変更してください)
storage:
dbPath: db\data
systemLog:
destination: file
path: db\logs\mongodb.log
-
storage.dbPath
: DBのデータを格納するためのディレクトリ -
systemLog.destination
: ログを格納する場所として、file
またはsyslog
を指定 -
systemLog.path
: (上記でfile
を設定した場合)ログを格納するファイル名
MongoDBサーバを起動(参考:Start mongod Processes)
$ mongod --config db/mongodb.conf
MongoDBシェルを起動して触ってみる(参考:mongo Shell Quick Reference)
$ mongo
quit()
でMongoDBシェルを終了できます。
MongoDBサーバを停止
以下はMongoDBシェルからサーバを停止する方法です。停止方法は他にもあります。(Stop mongod Processes)
$ mongo
$ use admin
$ db.shutdownServer()
Node.jsからMongoDBを使う
mongooseをインストール
MongoDBのモデル作成などが簡単にできるツールです。
$ npm install mongoose --save
mongooseでMongoDBに接続&モデル作成
DBのデータの取得・作成するためには、スキーマを定義する必要があります。
全体に関する詳しい説明はREADMEを、スキーマの詳細な定義方法はSchemaTypes参考にしてください。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Recipe = new Schema({
title: String,
content: String,
created_at: {
type: Date,
default: Date.now
},
last_modified_at: {
type: Date,
default: Date.now
}
});
mongoose.model('Recipe', Recipe);
mongoose.connect('mongodb://localhost:27017/recipes');
app.jsの先頭に require('./db/mongo')
を追加することで、アプリ起動時にMongoDBに接続するようにします。
mongooseでデータ作成&取得
先ほど定義したRecipeスキーマのインスタンスを作成して、作成と検索ができます。
save
やfind
を使用ます。
var db = require('mongoose');
var Recipe = db.model('Recipe');
new Recipe({
title: 'jaga bata',
content: 'potato + butter'
}).save(function (err, recipe){
if(err) {
console.log(err);
} else {
console.log('yay');
console.log(recipe);
}
});
Recipe.find()
.exec()
.then(function(recipes){
console.log('wow');
console.log(recipes);
})
.catch(function(err) {
console.log(err);
});
ExpressとMongoDBを組み合わせる
ExpressでGETリクエストやPOSTリクエストを作って上記のコードと組み合わせることで、動的なWebAPIを作ることができるようになりました。例えば、前述のルートパスへのGETリクエストの実装は以下のようになります。
var router = express.Router();
router.get('/', function(req, res, next) {
Recipe.find()
.exec()
.then(function(recipes){
res.json({recipes: recipes});
})
.catch(function(err) {
res.status(500).json({err: err});
});
});
module.exports = router
終わりに
最後まで読んでくださってありがとうございました!
ソースコードは少しずつ改善させていく予定です。