MemberApp promise - Express

アプリケーションの作成

アプリケーションの作成

express -e example

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

npm install

mysql2 パッケージのインストール

npm install mysql2

ディレクトリ・ファイル構成

  • example
    • bin
      • www
    • node_modules
      • ...
    • public
      • images
      • javascripts
      • stylesheets
        • style.css
    • routes
      • members
    • views
      • members
        • add.ejs
        • delete.ejs
        • edit.ejs
        • index.ejs
        • show.ejs
      • error.ejs
    • app.js
    • package-lock.json
    • package.json

データベースの設定

db.js

const mysql = require('mysql2/promise');

const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'users',
  password: 'password',
});

module.exports = pool;

メインプログラム

app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var membersRouter = require('./routes/members');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', membersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// 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;

ルーティング

./routes/members.js

var express = require('express');
var router = express.Router();
const pool = require('../db');
const mysql = require('mysql2/promise');

router.get('/', function(req, res, next){
  (async () => {
    try {
      const [results, fields] = await pool.query('SELECT * FROM users');
      let data = { users: results };
      res.render('members/index', data);
    } catch (err) {
      console.log(err);
    }
  })();
});

// レコードの追加
router.get('/add', (req, res, next) => {
  res.render('members/add');
});

router.post('/add', (req, res, next) => {
  let nm = req.body.name;
  let ag = req.body.age;
  let data = { 'name' : nm, 'age' : ag };

  (async () => {
    try {
      const [results, fields] = await pool.query('insert into users set ?', data);
      res.redirect('/');
    } catch (err) {
      console.log(err);
    }
  })();
});

// レコードの表示
router.get('/show/:id', (req, res, next) => {
  let id = req.params.id;

  (async () => {
    try {
      const [results, fields] = await pool.query('SELECT * FROM users where id=?', id);
      let data = { user: results[0] }
      res.render('members/show', data);
    } catch (err) {
      console.log(err);
    }
  })();
});

// 編集画面の遷移
router.get('/edit/:id', (req, res, next) => {
  let id = req.params.id;

  (async () => {
    try {
      const [results, fields] = await pool.query('SELECT * FROM users where id=?', id);
      let data = { user: results[0] }
      res.render('members/edit', data);
    } catch (err) {
      console.log(err);
    }
  })();
});

// 編集フォーム送信の処理
router.post('/edit', (req, res, next) => {
  let id = req.body.id;
  let nm = req.body.name;
  let ag = req.body.age;
  let data = { 'name' : nm, 'age' : ag };

  (async () => {
    try {
      const [results, fields] = await pool.query('UPDATE users SET ? WHERE id = ?', [data, id]);
      res.redirect('/');
    } catch (err) {
      console.log(err);
    }
  })();
});

// 削除画面への遷移
router.get('/delete/:id', (req, res, next) => {
  let id = req.params.id;

  (async () => {
    try {
      const [results, fields] = await pool.query('SELECT * FROM users WHERE id = ?', id);
      let data = { user: results[0] }
      res.render('members/delete', data);
    } catch (err) {
      console.log(err);
    }
  })();
});

// 削除フォームの送信処理
router.post('/delete', (req, res, next) => {
  let id = req.body.id;

  (async () => {
    try {
      const [results, fields] = await pool.query('DELETE FROM users WHERE id = ?', id);
      res.redirect('/');
    } catch (err) {
      console.log(err);
    }
  })();
});

module.exports = router;