【Express】いつ使うのか、コードを用いて解説し(させ)た

# はじめに
ChatGPTに聞いてみた結果です。
Qiitaの利用規約が最近以下のような改定がされました。
> 今回の改定によって大きく変わるポイントは以下の通りです。
「AIが生成した内容は正確性を確かめよう」の項目を追記
今回の改定は、AIを利用することそのものを禁止するものではありません。

確認したので、投稿します。

https://blog.qiita.com/guideline-update-2023-03/?utm_source=qiita&utm_content=official_column&utm_medium=referral

# Expressとは？
Expressは、Node.jsアプリケーションを構築するためのフレームワークであり、HTTPリクエストとレスポンスを扱うための多くの機能を提供します。以下は、いくつかの代表的な機能を実際のコードを用いて説明します。

公式のリファレンスです。

https://expressjs.com/ja/


# いつ使う？
## １．ルーティングの簡単化
Expressを使うことで、URLのパスやHTTPメソッドに基づいて、リクエストを処理するためのルーティングを簡単に定義できます。これにより、Webアプリケーションのコードを管理しやすくなり、保守性や可読性が向上します。
## ２．ミドルウェアの利用
Expressは、ミドルウェアを利用して、リクエストを処理する前後に処理を追加することができます。例えば、認証処理やログ出力などの共通処理をミドルウェアとして実装することで、コードの重複を減らすことができます。
## ３．テンプレートエンジンの利用
Expressは、様々なテンプレートエンジンをサポートしており、HTMLの生成を簡単に行うことができます。これにより、動的なWebページを作成することができます。
## ４．静的ファイルの配信
Expressを使うことで、静的ファイルの配信を簡単に行うことができます。これにより、Webサイトの表示速度を向上させることができます。
## ５．Web APIの作成
Expressを使うことで、Web APIを簡単に作成することができます。これにより、クライアントとサーバー間でJSONやXMLなどのデータをやりとりすることができます。

# 実際のコードを用いて解説
## １．ルーティング
ルーティングは、クライアントからのHTTPリクエストを処理するために、URLと関数をマッピングすることです。`Express`は、`app.get()`、`app.post()`、`app.put()`などのメソッドを提供しています。

```js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello, world!');
});
```
上記の例では、`app.get()`メソッドを使用して、ルートURL(/)に対するGETリクエストを処理するための関数を定義しています。関数内では、レスポンスに`Hello, world!`という文字列を送信しています。

## ２．ミドルウェア
ミドルウェアは、HTTPリクエストとレスポンスの間で実行される関数であり、リクエストを処理する前後に何らかの処理を挟むことができます。Expressは、app.use()メソッドを使用して、ミドルウェアを登録します。
```js
const express = require('express');
const app = express();

app.use(express.json());

app.post('/api/users', (req, res) => {
  console.log(req.body);
  res.send('User created successfully');
});
```
上記の例では、`express.json()`関数を使用して、HTTPリクエストのボディをJSON形式で解析するミドルウェアを登録しています。`app.post()`メソッドで/api/usersURLに対するPOSTリクエストを処理する関数を定義しています。関数内では、リクエストのボディをログに出力しています。

## ３．テンプレートエンジンの利用
テンプレートエンジンは、HTMLのようなテンプレートにデータを埋め込むことで、動的なHTMLコンテンツを生成するためのツールです。Expressを使うことで、様々なテンプレートエンジンを簡単に利用することができます。

以下に、テンプレートエンジンを使ってWebページを生成するための例を示します。ここでは、Pugというテンプレートエンジンを使用します。

まずは、Pugをインストールします。
```
npm install pug
```
次に、以下のような`views`ディレクトリを作成し、`index.pug`というファイルを作成します。
```index.pug
html
  head
    title My Website
  body
    h1 Welcome to my website, #{name}!
```
上記の例では、`#{name}`の部分には、後述するコードから受け取ったデータが埋め込まれます。
次に、以下のようなコードを作成します。
```js
const express = require('express');
const app = express();
const port = 3000;

// Pugを使用するための設定
app.set('views', './views');
app.set('view engine', 'pug');

// ルートにアクセスがあった場合の処理
app.get('/', (req, res) => {
  const name = 'John';
  res.render('index', { name });
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});
```
上記の例では、`app.set('views', './views')`と`app.set('view engine', 'pug')`を使用することで、`Pug`をテンプレートエンジンとして使用することを設定しています。

`app.get('/', (req, res) => {...})`の部分では、`res.render()`を使用することで、`views`ディレクトリ内の`index.pug`をレンダリングしてHTMLを生成し、レスポンスとして返します。また、`{ name }`の部分は、テンプレート内で使用する変数を渡すためのオブジェクトです。

ブラウザで`http://localhost:3000`にアクセスすると、以下のようなHTMLが生成されます。
```html
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <h1>Welcome to my website, John!</h1>
  </body>
</html>
```
上記の例では、Pugを使用して簡単に動的なHTMLを生成することができました。Pug以外にも、EJS、Handlebarsなど様々なテンプレートエンジンが存在し、Expressではこれらのテンプレートエンジンを簡単に使用することができます。

## ４．静的ファイルの配信
Expressは、静的ファイルを配信するための機能を提供しています。`express.static()`関数を使用して、静的ファイルのルートディレクトリを指定します。
```js
const express = require('express');
const app = express();

app.use(express.static('public'));
```
上記の例では、`public`ディレクトリを静的ファイルのルートディレクトリとして指定しています。つまり、`public`ディレクトリ以下のファイルにアクセスすることができます。

静的ファイルの配信をすることで、HTML、CSS、JavaScript、画像、動画などの静的ファイルをブラウザに直接配信することができます。これにより、Webサイトの表示速度を向上させることができます。

例えば、以下のようにディレクトリ構造を作成して、index.htmlファイルを配信することができます。
```ディレクトリ構成
public/
└── index.html
```
```js
const express = require('express');
const app = express();

app.use(express.static('public'));

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
```
## ５．Web APIの作成
```js
const express = require('express');
const app = express();
const port = 3000;

// リクエストボディのパース
app.use(express.json());

// ユーザー一覧を返すAPI
app.get('/users', (req, res) => {
  const users = [
    { id: 1, name: 'John' },
    { id: 2, name: 'Emily' },
    { id: 3, name: 'Mike' },
  ];
  res.json(users);
});

// ユーザーを作成するAPI
app.post('/users', (req, res) => {
  const user = req.body;
  // ユーザーの作成処理
  res.json(user);
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});
```
上記の例では、`/users`エンドポイントにGETリクエストがあった場合には、ユーザー一覧をJSON形式で返します。また、POSTリクエストがあった場合には、リクエストボディから受け取ったデータをもとに、ユーザーを作成します。

`express.json()`を使用することで、リクエストボディをJSON形式で受け取ることができます。`res.json()`を使用することで、JSON形式でレスポンスを返すことができます。

上記の例では、ユーザー一覧のデータは配列で定義されていますが、実際にはデータベースや外部APIなどからデータを取得することが一般的です。また、ユーザーの作成処理も実際にはデータベースなどに保存する処理が必要です。
# 終わり
俺、わかりやすい！