JavaScriptだけでWebサイト開発

node.js + Express + mongodb系 + React でサービスを作るメモ

ExpressでMongoDBへのCRUD機能を実現するRESTful Web APIを作ってみる

作るもの

  • Express内で定義したMongoDBのスキーマに対してデータをCreate,Read,Update,DeleteするWebAPIインターフェース
  • これまで作ってきた掲示板アプリのWebAPIを作ってみる

開発環境

1. Express プロジェクト作成

express-generator で雛形を作成します。テンプレートエンジンはデフォルトのままで作成。 これまで作ってきた掲示板機能のAPIを想定しています。

$ express kakiapi
 warning: the default view engine will not be jade in future releases
  warning: use '--view=jade' or '--help' for additional options

   create : kakiapi
   create : kakiapi/package.json
   create : kakiapi/app.js
   create : kakiapi/public
   create : kakiapi/views
   create : kakiapi/views/index.jade
   create : kakiapi/views/layout.jade
   create : kakiapi/views/error.jade
   create : kakiapi/routes
   create : kakiapi/routes/index.js
   create : kakiapi/routes/users.js
   create : kakiapi/bin
   create : kakiapi/bin/www
   create : kakiapi/public/javascripts
   create : kakiapi/public/images
   create : kakiapi/public/stylesheets
   create : kakiapi/public/stylesheets/style.css

   install dependencies:
     $ cd kakiapi && npm install

   run the app:
     $ DEBUG=kakiapi:* npm start

$ cd kakiapi/
$ npm install
npm WARN deprecated jade@1.11.0: Jade has been renamed to pug, please install the latest version of pug instead of jade
npm WARN deprecated transformers@2.1.0: Deprecated, use jstransformer
npm notice created a lockfile as package-lock.json. You should commit this file.
added 103 packages in 3.134s

以下フォルダが作成されました

.
├── app.js
├── bin/
│   └── www
├── node_modules/
├── package-lock.json
├── package.json
├── public/
│   ├── images
│   ├── javascripts
│   └── stylesheets
├── routes/
│   ├── index.js
│   └── users.js
└── views/
    ├── error.jade
    ├── index.jade
    └── layout.jade

2. express-restify-mongoose をインストール

express-restify-mongoose mongooseで定義したオブジェクトモデルに対してcrud機能を実現するmiddleware mongooseと合わせてインストールします

$ cd kakiapi
$ npm install mongoose express-restify-mongoose --save

3. app.jsを編集

app.js

var express = require('express');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

/// 追加
var mongoose = require('mongoose')
var restify = require('express-restify-mongoose')
///

var app = express();

/// 追加
var router = express.Router();
///

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

/// 追加
mongoose.connect('mongodb://localhost/app1',{useMongoClient:true});
restify.serve(router, mongoose.model('Post', new mongoose.Schema({
  name: { type: String },
  kakikomi: { type: String }
})));
app.use(router);
/// 

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

やったこと

  • express-generator で作成されたコードから以下を削除
    • favicon関連
    • view engine に関する記述
    • public/以下をstaticファイル配信する設定
    • index,usersのコントローラ
  • mongoose 接続を追加
  • express router と mongoose スキーマモデルをexpress-restify-mongooseで対応つける

これだけでデータベースのコレクションpostsに対するCRUD機能が使えるようになります。

method URL
GET http://localhost/api/v1/Post/count
GET http://localhost/api/v1/Post
POST http://localhost/api/v1/Post
DELETE http://localhost/api/v1/Post
GET http://localhost/api/v1/Post/:id
PUT http://localhost/api/v1/Post/:id
POST http://localhost/api/v1/Post/:id
PATCH http://localhost/api/v1/Post/:id
DELETE http://localhost/api/v1/Post/:id

データ操作の機能や検索条件、その他オプションはこちらで確認できます。
express-restify-mongoose

4. まとめ

  • たったこれだけのコードでMongoDBへのCRUD機能を持ったRESTful APIが実現できました。
©ichi-bit