フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

expressからSequelize ORMを利用して会員登録処理を実装する(テーブル作成まで)①

はじめに

  • 前回に会員登録フォームをreactで作成したので、この情報をサーバーに保存する
  • バックエンドはexpressを利用してDBはMySQLを利用する
  • expressからSequelize ORMを利用する px-wing.hatenablog.com px-wing.hatenablog.com

会員登録の画面イメージ

f:id:PX-WING:20200605013749p:plain

開発準備

Sequelize CLIを利用してユーザーのモデル作成

npx sequelize model:generate --name user --underscored --attributes user_name:string,mail_address:string,password:string,sex:string,birth_day:date,token:string,login_failure_count:integer

モデル作成時の注意点

  • 下記のように指定したフィールドの間にスペースを入れるとエラーになります。
npx sequelize model:generate --name user --underscored --attributes user_name:string, mail_address:string, password:string,sex:string, birth_day:date, token:string, login_failure_count:integer
  • 発生するエラー
Sequelize CLI [Node: 12.16.2, CLI: 5.5.1, ORM: 5.21.7]
ERROR: Attribute '' cannot be parsed: Cannot read property 'dataType' of undefined

migrateファイルが作成される

  • allowNullでNULLを許可しない、defaultにSequelize.NOWを指定して現在日時を登録できるように設定する
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      user_name: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      mail_address: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      password: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      sex: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      birth_day: {
        type: Sequelize.DATE,
        allowNull: false,
      },
      token: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      login_failure_count: {
        type: Sequelize.INTEGER,
        allowNull: false,
        default: 0
      },
      created_at: {
        allowNull: false,
        type: Sequelize.DATE,
        default: Sequelize.NOW
      },
      updated_at: {
        allowNull: false,
        type: Sequelize.DATE,
        default: Sequelize.NOW
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('users');
  }
};

modelファイル

  • 入力チェックやNULLは許可しない設定にしておきましょう。エラーメッセージの指定。
  • サーバーサイド側も最低限の入力チェックを行う
'use strict';
module.exports = (sequelize, DataTypes) => {
  const user = sequelize.define('user', {
    user_name: {
      type: DataTypes.STRING,
      allowNull: false,
      validate:{
        notEmpty: {
          msg: 'ユーザー名を入力してください'
        }        
      }
    },
    mail_address: {
      type: DataTypes.STRING,
      allowNull: false,
      validate:{
        notEmpty: {
          msg: 'メールアドレスを入力してください'
        }        
      }
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false,
      validate:{
        notEmpty: {
          msg: 'パスワードを入力してください'
        }        
      }
    },
    sex: {
      type: DataTypes.STRING,
      allowNull: false,
      validate:{
        notEmpty: {
          msg: '性別を入力してください'
        }        
      }
    },
    birth_day: {
      type: DataTypes.DATE,
      allowNull: false,
      validate:{
        notEmpty: {
          msg: '誕生日を入力してください'
        }        
      }
    },
    token: {
      type: DataTypes.STRING,
      allowNull: false,
      validate:{
        notEmpty: {
          msg: 'トークンが生成されておりません'
        }        
      }
    },
    login_failure_count:{ 
      type: DataTypes.INTEGER,
      allowNull: false,
    }
  }, {
    underscored: true,
  });
  user.associate = function(models) {
    // associations can be defined here
  };
  return user;
};

migrate実行

# npx sequelize-cli db:migrate

Sequelize CLI [Node: 12.16.2, CLI: 5.5.1, ORM: 5.21.7]

Loaded configuration file "config/config.json".
Using environment "development".
(node:450) [SEQUELIZE0004] DeprecationWarning: A boolean value was passed to options.operatorsAliases. This is a no-op with v5 and should be removed.
== 20200604153638-create-user: migrating =======
== 20200604153638-create-user: migrated (0.127s)

テーブル確認する

mysql> desc users;
+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int          | NO   | PRI | NULL    | auto_increment |
| user_name           | varchar(255) | NO   |     | NULL    |                |
| mail_address        | varchar(255) | NO   |     | NULL    |                |
| password            | varchar(255) | NO   |     | NULL    |                |
| sex                 | varchar(255) | NO   |     | NULL    |                |
| birth_day           | datetime     | NO   |     | NULL    |                |
| token               | varchar(255) | NO   |     | NULL    |                |
| login_failure_count | int          | NO   |     | NULL    |                |
| created_at          | datetime     | NO   |     | NULL    |                |
| updated_at          | datetime     | NO   |     | NULL    |                |
+---------------------+--------------+------+-----+---------+----------------+
10 rows in set (0.01 sec)