LoginSignup
17
24

More than 5 years have passed since last update.

ExpressとMongoDBで手っ取り早くREST APIを作る

Last updated at Posted at 2017-11-12

はじめに

自分の覚書としてこの記事を書きます。
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:3000http://localhost:3000/usersにシンプルな画面ができています。

ソースコードを解釈→WebAPIに変更

http://localhost:3000表示には以下のコード(抜粋)が関係していそうだとわかります。

app.js
var app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

var index = require('./routes/index');

app.use('/', index);
route/index.js
var router = express.Router();

router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router
views/index.pug
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に変化します!

routes/index.js
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のデータやログの格納場所を指定する必要があります。
今回は以下のように設定ファイルに設定してみます。(※パスは適宜変更してください)

db/mongodb.conf
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参考にしてください。

db/mongo.js
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スキーマのインスタンスを作成して、作成と検索ができます。
savefindを使用ます。

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リクエストの実装は以下のようになります。

routes/index.js
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

終わりに

最後まで読んでくださってありがとうございました!
ソースコードは少しずつ改善させていく予定です。

17
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
24