Help us understand the problem. What is going on with this article?

Node.js + Expressで超簡単API

概要

Node.jsExpressMongoDBを使用してAPIを作成する方法を紹介します。

作成するAPIへのリンク

簡単に用語紹介

本記事で使用する主要技術に関してざっくりと紹介させて頂きます。
これ以外で使用するpackage等は随時簡単な説明を行います。

  • Node.js: サーバサイドで動くJavaScriptです。
  • Express: Node.jsのMVCフレームワークです。
  • MongoDB: NoSQLと呼ばれるデータベースです。

前提条件

ここではNode.jsMongoDBがインストールされている事を開発の前提条件とします。
インストールされていない方は下記から簡単に行えます。

手順

本記事では以下の手順でAPIの開発を行います。

  1. 初期設定
  2. DB関連設定
  3. ルート設定
  4. コントローラ設定
  5. APIを組み上げる
  6. APIの動作確認

初期設定

プロジェクトの作成

まずはAPIを保管するディレクトリ(プロジェクト)の作成を行い、移動します。

$ mkdir todoApp
$ cd todoApp

package.jsonの作成

プロジェクト下で下記のコマンドを実行し、package.jsonを作成します。
package.jsonではプロジェクトの情報を記載したり、プロジェクトのdependenciesの管理を行ったりします。

$ npm init

npm init実行後、CLIにて下記のような質問がされます。
基本的に今はenter連打でデフォルトの設定で問題ありません。

package name: (todoAPP)
version: (1.0.0)
description: 
entry point: (index.js)
test command: 
git repository:
keywords:
author:
license: (ISC)

すると下記のようなpackage.jsonが出来上がります。

package.json
{
  "name": "todoapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

必要ファイルの設定

下記のコマンドで必要なディレクトリやファイルを作成していきます。

$ touch server.js
$ mkdir api
$ mkdir api/controllers api/models api/routes
$ touch api/controllers/taskController.js api/models/taskModel.js api/routes/taskRoutes.js

ここまで行うと、下記のようなディレクトリ構成になります。
image

DB関連設定

まずはmongooseというNode.jsアプリからMongoDBを操作するためのライブラリをインストールします。

npm install mongoose --save

そして、api/models/taskModel.jsを下記のように編集します。

api/models/taskModel.js
var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var TaskSchema = new Schema({
  name: {
    type: String,
    required: "Enter the name of the task"
  },
  Created_date: {
    type: Date,
    default: Date.now
  }
});

module.exports = mongoose.model("Tasks", TaskSchema);

各データがどのような構成になるべきか(Schema)をここで設定しています。
コードをみてわかる通り、各taskstring型のnameDate型のCreated_dateによって構成されています。

ルート設定

ルートではクライアントのリクエストに応じてどのようにアプリケーションが反応すべきかを定義していきます。
api/routes/taskRoute.jsを下記のように編集しましょう。

api/routes/taskRoute.js
module.exports = function(app) {
  var taskList = require('../controllers/taskController');

  app.route('/tasks')
    .get(taskList.all_tasks)
    .post(taskList.create_task);


  app.route('/tasks/:taskId')
    .get(taskList.load_task)
    .put(taskList.update_task)
    .delete(taskList.delete_task);
};

コードからもわかる通り、/tasksではGETリクエストを受けるとapi/controllers/taskControllerに定義されたall_tasksを実行し、POSTリクエストを受けるとcreate_taskを実行するよう設定されています。
api/controllers/taskControllerの関数はこれから定義します。

コントローラ設定

ルートで設定した関数をapi/controllers/taskController.jsに定義していきます。
CRUDを満たすように以下の5つの関数を定義します。各関数の役割はコード内のコメントにて記載しました。

api/controllers/taskController.js
var mongoose = require("mongoose"),
  Task = mongoose.model("Tasks");

// 全てのタスクを取得する。
exports.all_tasks = function(req, res) {
  Task.find({}, function(err, task) {
    if (err) res.send(err);
    res.json(task);
  });
};

// 新しいタスクを作成する。
exports.create_task = function(req, res) {
  var new_task = new Task(req.body);
  new_task.save(function(err, task) {
    if (err) res.send(err);
    res.json(task);
  });
};

// 特定のタスクを取得する。
exports.load_task = function(req, res) {
  Task.findById(req.params.taskId, function(err, task) {
    if (err) res.send(err);
    res.json(task);
  });
};

// 特定のタスクを更新する。
exports.update_task = function(req, res) {
  Task.findOneAndUpdate(
    { _id: req.params.taskId },
    req.body,
    { new: true },
    function(err, task) {
      if (err) res.send(err);
      res.json(task);
    }
  );
};

// 特定のタスクを削除する。
exports.delete_task = function(req, res) {
  Task.remove(
    {
      _id: req.params.taskId
    },
    function(err, task) {
      if (err) res.send(err);
      res.json({ message: "Task successfully deleted" });
    }
  );
};

APIを組み上げる

必要パッケージのインストール

まずはAPIを動かすのに必要な下記の2つのpackageをインストールします。
expressは冒頭で記載しました通り、Node.jsのMVCフレームワークです。
nodemonはファイルの変化があれば自動でアプリをリスタートしてくれる便利なpackageです。

$ npm install --save-dev nodemon
$ npm install express --save

server.jsにてAPIの組み上げを行う。

ここまでで設定したModel, Route, Controllerserver.jsにて組み合わせてAPIを稼働できるようにします。
server.jsを以下のように設定しましょう。

server.js
var express = require("express"),
  app = express(),
  port = process.env.PORT || 3000,
  mongoose = require("mongoose"),
  Task = require("./api/models/taskModel"), // 作成したModelの読み込み
  bodyParser = require("body-parser");

mongoose.Promise = global.Promise;
mongoose.connect("mongodb://localhost/Tododb");

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var routes = require("./api/routes/taskRoutes"); // Routeのインポート
routes(app); //appにRouteを設定する。

app.listen(port); // appを特定のportでlistenさせる。

console.log("todo list RESTful API server started on: " + port);

APIの起動・動作確認

APIの起動方法

まずは下記のコマンドでDBサーバを走らせます。

$ mongod

そして、ターミナル上で別のタブを開き、下記のコマンドでAPIを動かしてみましょう。

$ npm run start

postmanを使用しての動作確認

POST (http://localhost:3000/tasks)

まずはデータの作成を行なってみましょう。
PostリクエストなのでURLを入力す左側の選択肢をPostに設定し、json形式のデータを渡します。

image.png

Get(http://localhost:3000/tasks)

次にデータを取得してみましょう。
GETリクエストなのでURLを入力する左側の選択肢をPOSTからGETに変更し、実行してみましょう。
image.png

GET(http://localhost:3000/tasks/:id)

今度はidで指定して必要なデータのみを取得します。
image.png

PUT(http://localhost:3000/tasks/:id)

次は一度登録したデータをUpdate(更新)してみましょう。
URL左の選択肢をPUTに変更。
image.png

DELETE(http://localhost:3000/tasks/:id)

最後に一度登録したデータをDestroy(削除)してみましょう。
URL左の選択肢をDELETEに変更。
image.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした