Express.js と Sequelize を使用したサーバーおよびデータベースの構築

これは、Express.js で Sequelize を使用する基本的な手順と設定、Sequelize を使ったデータベースへの接続、Sequelize 設定ファイルの作成、モデルの定義と接続についての記事です。

Sequelize のインストール

Express アプリケーションで Sequelize を使用するためには、まず必要なパッケージをインストールします。

Install Sequelize

npm install --save sequelize mysql2

Sequelize インスタンスの作成と確認

これは Sequelize 設定の基本例です。

app.js ファイルに記述できます。

データベース接続を確認します。接続が成功した場合はコンソールメッセージを表示し、失敗した場合はエラーを表示します。

注:ハードコーディングの使用は避けてください。セキュリティ上の問題を引き起こす可能性があります。

DB_NAME の代わりに process.env.DB_NAME、'test'の代わりに process.env.USER_ID、'1234'の代わりに process.env.USER_PASSWORD を使用し、.env ファイルを利用してください。

Sequelize Setting

const Sequelize = require('sequelize');
const sequelize = new Sequelize('DB_NAME', 'test', '1234', {
    host: '127.0.0.1',
    dialect: 'mysql',
});

sequelize
    .authenticate()
    .then(() => {
        console.log('데이터베이스 연결에 성공했습니다.');
    })
    .catch((err) => {
        console.error('데이터베이스 연결에 실패했습니다:', err);
    });

Sequelize 設定ファイルの作成

さまざまな環境(開発、テスト、本番)のデータベース設定を管理するために、config/config.js ファイルを作成します。

以下は例です。作成したデータベース名、個人のユーザー ID、個人のパスワードを使用してください。

開発、テスト、本番の 3 つの環境に対する設定を記述できます。Git Flow Logic に従って、models/index.js の設定を各環境に合わせて変更するだけで、希望する環境のデータベースに切り替えることができます。

上記のように、ハードコーディングの使用は避けてください。

config.js

module.exports = {
  development: {
    username: 'test',
    password: '1234',
    database: 'test',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
  test: {
    // 테스트 환경 설정
  },
  production: {
    // 프로덕션 환경 설정
  },
};

モデルと接続ファイル(models/index.js)の作成

models/index.js ファイルは Sequelize モデルを初期化し、管理します。このファイルはすべてのモデルをインポートし、データベースに接続し、関連を設定する中心的な役割を果たします。

これが現在使用中のコードです。

process.env.NODE_ENV を使用して開発環境かどうかを確認できます。

データベース接続設定は config/config.js からインポートされます。

モデルの場合、fs.readdirSync を使用してモデルファイルを動的に読み込みます。

モデル間の関係は、各モデルファイルで設定できます。(1:1、1:N、N:M)

model/index.js

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.js')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs.readdirSync(__dirname)
  .filter((file) => {
    return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js' && file.indexOf('.test.js') === -1;
  })
  .forEach((file) => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

開発のための実際の例 (Local)

config.js ファイルについては、dotenv を使用してセキュリティを強化してください。

例を提供するためにハードコーディングが行われています。

models/index.jsは提供された例通りです。

config/config.js

require('dotenv').config();

module.exports = {
  development: {
    username: 'test',
    password: '1234',
    database: 'test',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
  test: {
    username: 'root',
    password: null,
    database: 'database_test',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
  production: {
    username: 'root',
    password: null,
    database: 'database_production',
    host: '127.0.0.1',
    dialect: 'mysql',
  },
};

new Sequelize(データベース名, ユーザー ID, ユーザーパスワード)の順に入力してください。または、暗号化のために process.env を使用してください。

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD)

app.js

const express = require('express');
const cors = require('cors');
const app = express();
const userRoutes = require('./routes/user');
const postRoutes = require('./routes/post');
require('dotenv').config();

const PORT = 3345;
const Sequelize = require('sequelize');

app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
   host: '127.0.0.1',
   dialect: 'mysql',
 });

sequelize
  .authenticate()
  .then(() => {
    console.log('데이터베이스 연결에 성공했습니다.');
  })
  .catch((err) => {
    console.error('데이터베이스 연결에 실패했습니다:', err);
  });

app.get('/', (req, res) => {
  res.send('Food-bnb-server On!');
});

app.use(
  cors({
    origin: 'http://localhost:3000', // 허용하고 싶은 도메인
    credentials: true, // 응답 헤더에 Access-Control-Allow-Credentials 추가
  }),
);

app.use('/user', userRoutes);
app.use('/post', postRoutes);

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('문제가 생겼네요.');
});

app.listen(PORT, () => {
  console.log(`서버 포트: ${PORT}`);
});