Node.jsを利用した単純なREST APIの書き方

近年、技術の進歩は急速に増加しています。 その結果、スピードとセキュリティに関してもサービスの質は向上しています。それを考慮すれば開発者にとっても同じです。なぜなら、開発者として、技術が作られてよく知られるようになるたびに、それを学ぶべきの責任があります。だから、この記事のため、有名なウェッブ開発に関する技術の一つを教えたいだと思います。Node.jsを利用したREST APIを作り方というトピックです。

こんにちは！マルクス（Twitter Account: [@markusveeyola](http://twitter.com/markusveeyola)）です。現在、奥多摩日本語学校の学生で、同時に、IT開発者としてアルバイトをしています。

それでは、始めましょうか！

#何を開発するのか

このチュートリアルでは、CRUD操作の基本機能を持つREST APIを作成するつもりです。単純に言えば、このアプリを作るために、いくつか操作を書く必要があります。下の部分を見られるように、その４つの操作が書いてあります:

1. **CREATE**ーこの操作は新しいデータを作成する責任があります。
2. **READ**ーこの操作はデータを読んでゲットする責任があります。
3. **UPDATE**ー何か変化したいデータがあれば、この操作はデータをゲットすて変更する責任があります。
4. **DELETE**ーこの操作はデータを消す責任があります。

そのうちに、手順をわかりやすくするためにいくつかのことを明確にします。このチュートリアルの範囲はデータベースでREST APIを作成する方法をカバーしていません。このチュートリアルの目的は、Node.jsを使用してREST API用のコードを作成する基本的な実装を示すことだけです。そういうことで、データベースに接続してデータを保存する方法は、このチュートリアルでは説明しません。


## 使う技術

###**[Node.jsとは](https://nodejs.org/en/docs/)**
高速でスケーラブルなネットワークアプリケーションを簡単に構築するための、ChromeのJavaScriptランタイム上に構築されたプラットフォームです。イベント駆動型のノンブロッキングI / Oモデルは、分散型デバイスをまたいで実行される軽量で効率的なデータ集約型のリアルタイムアプリケーションに最適です。

###**[Expressとは](https://expressjs.com/en/api.html)**
これは、シングルページ、マルチページ、およびハイブリッドWebアプリケーションを構築するために設計されたNode.js ウェッブアプリケーションサーバーフレームワークです。これはnode.jsの事実上の標準サーバーフレームワークです。

###**[Nodemonとは](https://nodemon.io/)**
Node.jsアプリケーションの変更を監視し、自動的にサーバーを再起動する開発依存関係で、時間と面倒な作業を省きます。その結果、Nodemonで開発時間は早くなります。

## 前提条件
後で、申請をするとき、我々の手順が正しく機能するようにするために、これらは必要な条件です。

- **[Node.js](https://nodejs.org/en/docs/)**と**[NPM](https://docs.npmjs.com/)**はインストールした必要があります。
- **[Node Package Manager「NPM」](https://docs.npmjs.com/)**の基本的な知識
- **[Node.js](https://nodejs.org/en/docs/)**言語の基本的な知識
- **[Postman](https://www.getpostman.com/downloads/)**: HTTP Requestをテストする責任があります。

#開発時間
プロジェクトを初期化するために、先ずはアプリを作りたい場所のフォルダに行ってください。そのフォルダーから、ターミナルに行って、「**mkdir**」コマンドラインを使って、プロジェクトの名前として「**NodeREST**」に付けて、入力してください。新しいフォルダーは作られるはずです。その後はそのフォルダーに行くため、「**cd**」コマンドラインと「**NodeREST**」を付けて、入力してください。

```console
例: 
D:\Programming\Testing\> mkdir NodeREST
D:\Programming\Testing\> cd NodeREST
D:\Programming\Testing\NodeREST\>
```
「**NodeRest**」フォルダーはもう作られたら、とうとうプロジェクトを始めるために、ターミナルからこのNPMのコードを入力してください。普通に、各々のコマンドライン実行の中には時間がかかるかもしれないので、しばらくお待ちください。

```console
例: 
D:\Programming\Testing\NodeREST\>　npm init -y
D:\Programming\Testing\NodeREST\>　npm install -g nodemon　&& npm install -s express
```

それでは、何が起こったんでしょうか。上のコードを見られるように、NPMの「**init**」を使って、プロジェクトを初期化するようになりました。初期化できた後、NPMの「**install**」で**express**と**nodemon**のライブラリパッケージをインストールするようになりました。

必要な**NPM**パッケージはもうインストールされたので、今回は操作のコードを書き始めます!

最初は好んだコードエディタを開けてください。私にはVisual Studio Codeを使っています。エディタからNodeRESTのフォルダーを開けてください。その後、フォルダーから新しいファイルを作って、「**index.js**」と名前をつけてください。手順を正しくやれば、エディタのファイルリストから、ファイル構造になるはずです。

```
NodeREST
    > node_modules
    > index.js
    > package.json
    > package-lock.json
```
今回は、コードを書く時間です！「**index.js**」ファイルに行ってください。

先ずはインストールされた**NPM**パッケージから、**express**ライブラリをインポートして、**express**という変数に保存します。その変数を使って別の**app**という変数に**express**変数のインスタンスを保存します。これから、**express**ライブラリの機能をもう使えます。アプリは**JSON**コードを理解してもらうように、**express**変数の**json**の関数**app**変数に設定します。この下のコードになるはずです。

```js
const express = require('express');
const app = express();
```
では、サイトのPORTを設定しましょう。このコードは一番下の部分を置いてください。下のコードから、デフォルトとして、3000のPORTを設定します。

```js
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port ${port}...`));
```

次の手順は必要がないんですけど、アプリを正常に作動することを確認するために、メインページを作った方がいいんだと思います。**app**の**get**関数を使って、パラメータの中に**route**を設定できるし、**request**と**result**を利用できます。今のところ、**route**と**res**を使うだけです。メインページだから、**route**に「**/**」だけを設定してください。その 設定した**route** を使ったら、**get**関数の内容は作動されます。その内容には、何が起こるか決めることができます。

この操作には**res**の**send**関数を使って、データを送れます。この場合は「**Simple REST API**」というstringを書いてください。後は、この操作の最終出力として、このコードになります。

```js
app.get('/', (req, res) => {
    res.send('Simple REST API');
});
```

では、チェックする時間だね。でも。その前に今、**Postman**を開けてください。プロジェクトーのターミナルから、このコマンドラインを入力してください。

```sh
nodemon index.js
```

上のコードから、nodemonライブラリでindex.jsはテストサーバーに配備されます。ここから、**Postman**に戻ってください。ログインの後で、URLの左から、ドロップダウンリストに、**GET**を選んで、URLに行って、「**localhost:3000/**」を入力してください。**Send**のボタンをクリックすると、この結果になるはずです。

![main.PNG](https://qiita-image-store.s3.amazonaws.com/0/300940/a8e7486e-60db-2ffc-1f68-eada3e277f84.png)

上から、もう見えるように手順を正しくやったら、「**Simple REST API**」出力は結果として見せられます。

さて、**READ**の操作をつくります。データベースを使わないので、その代わりに定義済みデータを作ります。とりあえず、データはコンピューター大学の専攻に関連します。このコードをインポートのコードの下で置いてください。

```js
const courses = [
    { id: 1, name: 'computer science'},
    { id: 2, name: 'information technology'},
    { id: 3, name: 'business intelligence'},
];
```
それでは、これらの定義済みデータを**READ**関数から取得しましょう。他のすべての操作は同じ構造を持ち、**route**と**request**と**result**を持ちます。それで、**route**のために、**api/courses**として設定します。後は中に、**res**のsend関数に上の**courses**変数を設定します。この下の部分のようになります。

```js
app.get('/api/courses', (req, res) => {
    res.send(courses);
});
```

確認するために、**Postman**に戻って、URLに行って、「**/**」だけの代わりに、設定した**route**と同じで「**api/courses**」を追加してください。「**localhost:3000/api/courses**」になります。**Send**のボタンをクリックしたら、この結果のようになるはずです。


![getall.PNG](https://qiita-image-store.s3.amazonaws.com/0/300940/2741414b-65c0-b923-9b84-d63c828a9235.png)

それはもう終わったので、今回は**CREATE**操作を作ります。二つの操作と違って、新しいデータを作るので、POSTのHTTP REQUESTが必要です。そう言えば、**app**の**get**関数を使う代わりに、**app**の**post**関数を使います。

心配しなくていいんですよ。関数構造まだ同じです。**route**には、まだ「**api/courses**」を使います。READと同じだけど、違うHTTP REQUESTを使っているので、同じの**route**は問題がないんです。内容には**course**変数を作って、courses.lengthによって**id**は設定されます。**name**は**req.body**から専攻の名前をもらえます。後は**courses**変数に**course**を保存します。とうとう、この関数はちゃんと作動するか確認するために、その**course**も結果として送ります。関数の最後のコードはこれです。

```js
app.post('/api/courses', (req, res) => {
    const course = {
        id: courses.length + 1,
        name: req.body.name
    };
    courses.push(course);
    res.send(course);
});
```
もう一度、確認します。**Postman**からも、**GET**を使う代わりに、**POST**に変化してください。URLはそのままでもういいです。次、**Body**タブをクリックして、**raw**のラジオボタンをクリックして、右のドロップダウンリストから**JSON (application/json)**を選んでください。サンプルとして、テキストフィールドからこの**JSON**情報を入れてください。

```json
{
    "name": "information systems"
}
```
とうとう、Sendのボタンをクリックしたら、この結果のようになるはずです。
![create.PNG](https://qiita-image-store.s3.amazonaws.com/0/300940/c5586520-b2f4-6a68-e703-60dcc0ebdb2b.png)

新しいデータを作った後で、本当に保存されたかどうか確認できます。**READ**操作に戻ったら、その新しいデータは確かに追加されました。

さて、次は**UPDATE**操作です。そうなら、appのput関数を使うべきではあります。特定のデータを変化したいんですから、**route**は「**api/courses/:id**」になります。そうすると、**req.params**から、**Postman**から、その設定する**:id**をもらえます。それを使って、関数の中に、courses変数からその特定のデータを見つけられます。**req.body**から、設定する名前を貰って**course.name**に変化できます。この感じです。

```js
app.put('/api/courses/:id', (req, res) => {
    const course = courses.find(c => c.id === parseInt(req.params.id));
    if (!course) return res.status(404).send('The course with the given ID was not found.');

    course.name = req.body.name;
    res.send(course);
});
```

終わった操作と違って、URLはちょっと違うです。特定のデータなので、**courses**変数の**id**から選んで追加してください。例えば、「**localhost:3000/api/courses/1**」になります。
ドロップダウンリストからも、**PUT**を選んでください。最後は**CREATE**操作の手順と同じで、**Body**タブから、この**JSON**情報を入力してください。

```json
{
    "name": "software engineering"
}
```

**Send**のボタンをクリックすると、この結果が起こります。まだ同じですから、確認したかったら、作った**READ**操作を使ってください。

![update.PNG](https://qiita-image-store.s3.amazonaws.com/0/300940/c2c461ec-e85d-6092-bf98-390458a7dc6f.png)

最後の操作は**DELETE**です！**route**は**UPDATE**操作と同じですから、**route**をコピーできます。コードはちょっと同じんですけど、javascriptのsplice関数を使って、**courses**変数から、データを消すことができます。もう一回、確認するために**course**を送ります。このコードのようになるべきです。

```js
app.delete('/api/courses/:id', (req, res) => {
    const course = courses.find(c => c.id === parseInt(req.params.id));
    if (!course) return res.status(404).send('The course with the given ID was not found.');

    const index = courses.indexOf(course);
    courses.splice(index, 1);

    res.send(course);
});
```

**DELETE**操作には、**Postman**のテストは簡単になりました。URLは**UPDATE**操作と同じですから、変化しなくていいんです。もうあるデータを選んで、***Send**のボタンをクリックしたら、この結果が起こるはずです。

![delete.PNG](https://qiita-image-store.s3.amazonaws.com/0/300940/2848d211-f4c2-f8aa-a52a-f831950fc831.png)

**READ**操作を使ったら、この後で選んだデータはもう無くなります。

##フルコード
```js
const express = require('express');
const app = express();

app.use(express.json());

const courses = [
    { id: 1, name: 'computer science'},
    { id: 2, name: 'information technology'},
    { id: 3, name: 'business intelligence'},
];

app.get('/', (req, res) => {
    res.send('Simple REST API');
});

app.get('/api/courses', (req, res) => {
    res.send(courses);
});

app.get('/api/courses/:id', (req, res) => {
    const course = courses.find(c => c.id === parseInt(req.params.id));
    if (!course) return res.status(404).send('The course with the given ID was not found.');
    res.send(course);
});

app.get('/api/posts/:year/:month', (req, res) => {
    res.send(req.query);
});

app.post('/api/courses', (req, res) => {
    const course = {
        id: courses.length + 1,
        name: req.body.name
    };
    courses.push(course);
    res.send(course);
});

app.put('/api/courses/:id', (req, res) => {
    const course = courses.find(c => c.id === parseInt(req.params.id));
    if (!course) return res.status(404).send('The course with the given ID was not found.');

    course.name = req.body.name;
    res.send(course);
});

app.delete('/api/courses/:id', (req, res) => {
    const course = courses.find(c => c.id === parseInt(req.params.id));
    if (!course) return res.status(404).send('The course with the given ID was not found.');

    const index = courses.indexOf(course);
    courses.splice(index, 1);

    res.send(course);
});


const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on port ${port}...`));
```
#終わり
これでチュートリアルは終了しました。Node.jsを利用してREST APIアプリケーションを作成する方法について多くのことを学んだことを願っています。 Node.jsを使ってできることはまだたくさんあります。それがどのように機能するかの基本を紹介しただけです。私はちょうどあなたにそれがほとんどの人が考えるよりも簡単だという印象を与えたいと思いました。

だから、先に行き、もっと学びましょう。この記事を読んでくれてありがとう。これが参考になった場合は、「いいね！」と書いてください。

それまでは、周りで会いましょう。