【Node.js】MySQLとの連携を試す

研究
OLYMPUS PEN E-PL9 (c)Maya
この記事は約12分で読めます。

この記事は1年前の記事です。当時の情報、理解に基づいておりますのでご留意ください

はじめに

例によって参考サイトと首っぴきです。

DockerでNode.jsアプリケーションを開発する (3) MySQL用コンテナを追加 - Ishida-IT LLC

YAMLファイルで叱られました

$ docker-compose up -d
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.networks: 'backend'
Unsupported config option for services.volumes: 'mysqldata'

叱られる。めいめいの行のインデントが誤っていた。
修正して動いたのがこちら。
(なお必要なフォルダは作ってあるものとします。)

version: '3'
services:
  mysql:
    image: mysql:5.7
    env_file: ./mysql/mysql.env
    environment:
      - TZ=Asia/Tokyo
    ports:
      - '3306:3306'
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d/:ro
      - mysqldata:/var/lib/mysql
    networks:
      - backend

  app:
    # 起動するイメージを指定(ここではNode.js v12の公式イメージ)
    image: node:12

    # 環境変数を設定
    environment:
      - DEBUG=app:*

    tty: true

    # ホスト側のポート:コンテナのポート
    ports:
      - '3000:3000'

    # ソースコードを格納するフォルダをマウント
    #(ホスト側の./srcをコンテナの/appにマウント)
    volumes:
      - ./src:/app

    # 起動時のカレントフォルダを指定
    working_dir: /app

    # 起動後に実行するコマンドを指定
    command: npm run dev
    networks:
      - backend
    depends_on:
      - mysql

  mail:
    image: mailhog/mailhog
    ports:
      - 8025:8025

networks:
  backend:

volumes:
  mysqldata:

mailhogをつけました。これで、
http://127.0.0.1:3000/?message=test で実行状況が参照できて
http://127.0.0.1:8025/ でmailが見られます。

SequelizeによるDBマイグレーション

あとは参考リンク通りにSequelizeによるDBマイグレーションを行います…

$ docker-compose run --rm app npx sequelize-cli db:migrate
Creating nodejsmysqldocker_app_run ... done

Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config/config.js".
Using environment "development".

ERROR: connect ECONNREFUSED 127.0.0.1:3306

叱られます。
あれこれググっていると、sequelize cliのhelpを参照できました。

root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --help 

Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5]

Options:
  --version          Show version number                                                                                                                                      [boolean]
  --help             Show help                                                                                                                                                [boolean]
  --env              The environment to run the command in                                                                                            [string] [default: "development"]
  --config           The path to the config file                                                                                                                               [string]
  --options-path     The path to a JSON file with additional options                                                                                                           [string]
  --migrations-path  The path to the migrations folder                                                                                                 [string] [default: "migrations"]
  --seeders-path     The path to the seeders folder                                                                                                       [string] [default: "seeders"]
  --models-path      The path to the models folder                                                                                                         [string] [default: "models"]
  --url              The database connection string to use. Alternative to using --config files                                                                                [string]
  --debug            When available show various debug information                                                                                           [boolean] [default: false]
  --to               Migration name to run migrations until                                                                                                                    [string]
  --from             Migration name to start migrations from (excluding)                                                                                                       [string]
root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --debug

Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config/config.js".
Using environment "development".

ERROR: SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
    at ConnectionManager.connect (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:116:17)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
EXTRA MESSAGE: connect ECONNREFUSED 127.0.0.1:3306

但し言われていることは文章量が増えた以外変わりません。
もしやと思い、src/config/config.js の先頭に

console.log(process.env.MYSQL_SERVER);

これを入れてみて、再度実行。5行目が上記の結果です。

root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --debug

Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5]

undefined # ←これが結果です
Loaded configuration file "config/config.js".
Using environment "development".

ERROR: SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:3306
    at ConnectionManager.connect (/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:116:17)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
EXTRA MESSAGE: connect ECONNREFUSED 127.0.0.1:3306

ならば、と src/config/config.js を以下の様に修正後、執念く実行。

console.log(process.env.MYSQL_SERVER);

module.exports = {
  development: {
    username: "root",
    password: "password",
    database: "todo",
    host: "mysql",
    dialect: 'mysql',
  },
  test: {
    username: process.env.MYSQL_USER,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE,
    host: process.env.MYSQL_SERVER,
    dialect: 'mysql',
  },
  production: {
    username: process.env.MYSQL_USER,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE,
    host: process.env.MYSQL_SERVER,
    dialect: 'mysql',
  },
};
root@ad11e8ca120d:/app# npx sequelize-cli db:migrate --debug

Sequelize CLI [Node: 12.19.0, CLI: 6.2.0, ORM: 6.3.5]

undefined
Loaded configuration file "config/config.js".
Using environment "development".
== 20201029022948-create-task: migrating =======
== 20201029022948-create-task: migrated (0.073s)

やっと通りました。最初のリンクの次以降の項目へ戻ります。
.jadeファイルとか初見過ぎるけど後で追う。
なお src/routes/index.js の末尾は module.exports = router; で締めないと叱られる。

ここまでsequelizeとExpressのやってくれている仕事が多く理解が追いついていない節はありますが、動くものはまあできました。

あとは一旦githubに公開し、肉付けをしてみます。

なお今回の状態

mayarin/NodejsMySQLDocker
Contribute to mayarin/NodejsMySQLDocker development by creating an account on GitHub.

コメント

タイトルとURLをコピーしました