Node.jsのフレームワークExpress.jsとMysqlを使ったCRUDアプリケーションの作成

Node.jsのフレームワークExpressを使い、Mysqlを使ったCRUDアプリケーションの作成を行う。また、テンプレートエンジンとしてEJSを利用する。

目次

1.本稿の実行環境
(1)ホストOS
 Windows 10 Pro
(2)仮想環境(VirtualBox)
 ・ゲストOS:CentOs8(Red Hat 64-bit)
 ・nodejs、及びnpmはインストール済
 # node -v
 v10.24.0
 # npm –version
 6.14.11

2.CRUDアプリケーションの概要
(1)データベース
・データベース名:crud_db
・テーブル(users)

(2)画面

3.開発環境作成
 WebフレームワークExpressとテンプレートエンジンEJS、およびデータベースMysqlによるアプリケーションの開発環境を作成する。
(1)Express.jsのインストール
・ディレクトリを任意の名前で作成
ここでは、”crud-app”とした。
・パッケージ情報の作成
 作成したディレクトリに移動して、パッケージ情報を作成する。
 # cd crud-app
 # npm init -y
 package.jsonファイルが作成される
・express.jsのインストール
 # npm install express

(2)テンプレートエンジンEJSのインストール
 $ npm install ejs

(3)MySQL接続ドライバのインストール
 express.jsからMySQLへ接続するためのドライバをインストールする。
 # npm install mysql

(4)データベースとテーブルの準備
データベース(crud_db)とテーブル(users)を作成する。
・Mysqlに接続
# mysql -u root -p
・データベースの作成
mysql> CREATE DATABASE crud_db;
・テーブルの作成mysql> CREATE TABLE users (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL);
・テーブルのフィールドの確認mysql> SHOW COLUMNS FROM users;
・テーブルが作成されたことを確認する

4.CRUDアプリケーションの作成
(1)nodejsアプリ
crud_app.js

const express = require('express');
const mysql = require('mysql');
const app = express();

app.use(express.urlencoded({extended: false}));

//mysqlと接続
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',//mysqlのインストール時の設定に合わせる
  password: ' ',//mysqlのインストール時の設定に合わせる
  database: 'crud_db' //作成したDBの名前
});

//viewsディレクトリ以下のejsファイル認識させる
app.set('views', './views');
app.set('view engine', 'ejs');

//新規作成画面のルーティング
app.get('/new', (req, res) => {
    res.render('new.ejs');
});

//新規登録
app.post('/create', (req, res) => {
connection.query(
    'INSERT INTO users (name, email) VALUES (?, ?)',
    [req.body.name, req.body.email],
    (error, results) => {
    res.redirect('/');//一覧画面へ
    }
);
});

//一覧画面のルーティング
app.get('/index', (req, res) => {
    connection.query(
      'SELECT * FROM users',
      (error, results) => {
        res.render('index.ejs', {items: results});//検索結果をitemsというキーでviewに渡す
      }
    );
  });

//編集画面のルーティング
app.get('/edit/:id', (req, res) => {
    connection.query(
      'SELECT * FROM users WHERE id = ?',
      [req.params.id],
      (error, results) => {
        res.render('edit.ejs', {item: results[0]});
      }
    );
});

//更新
app.post('/update/:id', (req, res) => {
    connection.query(
    'UPDATE users SET name = ?, email = ? WHERE id = ?',[req.body.name, req.body.email, req.params.id],(error,results)=>{
      res.redirect('/');
    })
});

//削除
app.post('/delete/:id', (req, res) => {
    connection.query(
      'DELETE FROM users WHERE id = ?',
      [req.params.id],
      (error, results) => {
        res.redirect('/');
      }
    );
});

//新規作成画面のルーティング
app.get('/', (req, res) => {
    res.render('menu.ejs');
});

app.listen(3000);//3000ポートでローカルサーバーを立てる

(解説)
・const express = require(‘express’);
require()でモジュール(オブジェクト)を呼び出す
・const app = express();
 express()オブジェクトを作成する
・app.use(express.urlencoded({extended: false}));
 urlencoded()メソッドでフォームデータを読めるようにする
・app.get(‘/new’, function (req, res) {
・・・})
 get受信時のルーティングとコールバック関数を定義する。
・connection.query(sql,コールバック関数)
 queryメソッドのコールバック関数は第一引数にクエリを文字列で指定、第二引数にはコールバック関数を指定する。
 コールバック関数ではerror, results, fieldsの引数を用いることができ、errorにはクエリ実行時のエラー、resultsにはクエリ実行後の結果、fileldsにはクエリの結果のフィールドの情報が入る。
connection.query(
‘SELECT * FROM users’,
(error, results,fields ) => {
console.log(results);
resultsの内容は、
[ RowDataPacket { id: 10, name: ‘test1’, email: ‘test1@test1.com’ },
RowDataPacket { id: 11, name: ‘test2’, email: ‘test2@test2.com’ } ]
・res.render(‘index.ejs’, {items: results})
使用するテンプレートファイルの指定とテンプレートファイルに渡すデータを{キー値: ‘渡す値’}で指定する。
 テンプレートの”index.ejs”内では<%= キー値 %>と記述することでデータを埋め込むことができる。

(2)テンプレートファイル
views/menu.ejs

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メニュー</title>
</head>
<body>
<h2>【ユーザー管理】</h2>
<a href="/new">『ユーザー登録』</a><br>
<a href="/index">『ユーザー一覧』</a>
</body>
</html>

views/index.ejs

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>ユーザー一覧画面</title>
</head>
<body>
<table>
  <tr>
   <th >名前</th>
   <th >EMail</th>
   <th >ボタン</th>
   <th >ボタン</th>
  </tr>
  <tr>
   <% items.forEach((item) => { %> 
    <td><%= item.name %></td>
    <td><%= item.email %></td>
    <td>
     <a href="/edit/<%= item.id %>">編集</a>
    </td>
    <td>
     <form action="/delete/<%= item.id %>" method="post">
       <input type="submit" value="削除">
     </form>
    </td>
  </tr>
 <% }) %>
 </table>
 <a href="/">戻る</a>
</body>
</html>

views/new.ejs

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>登録</title>
</head>
<body>
<form action="/create" method="post">
    名前:<input type="text" name="name"><br>
    Email:<input type="text" name="email"><br>
    <input type="submit" value="登録">
    <a href="/">戻る</a>
</form>
</body>
</html>

views/edit.ejs

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>編集</title>
</head>
<body>
 <form action="/update/<%= item.id %>" method="post">
  名前:<input type="text" name="name" value="<%= item.name %>"><br>
  EMail:<input type="text" name="email" value="<%= item.email %>"><br>
  <input type="submit" value="更新">
  <a href="/">戻る</a>
 </form>
</body>
</html>

5.アプリケーションの実行
(1)Mysqlサーバの起動
 # service mysqld start
(2)nodeアプリケーションの実行
 crud_app.jsのディレクトリで下記コマンドを実行
 # node crud_app.js
(3)ブラウザからnodeのWebサーバに接続   http://127.0.0.1:3000/

The end