Seaquelize×DAOの実装 - ChuN6868/CodeChrysalis-fullstuck-project GitHub Wiki

手順

前提

routerやseriviceの設定は完了しており、DBにテーブルやデータは登録されているものとする。
また、クエリーパラメータ周りで"path-to-regexp"ライブラリ関連のエラーが発生するため、expressのバージョンはv5系ではなく、v4系を使用すること。

// expressのアンインストール
npm uninstall express

// expressのバージョンを指定してのインストール
npm install [email protected]

npm install関連

下記のコマンドを実行

npm install dotenv sequelize tedious
npm install --save-dev sequelize-typescript sequelize-cli sequelize-auto

Modelsの作成

下記のsequelize-autoのコマンドでmodelsのファイルを自動生成する。

// データベース名やホスト名などは実際のものに書き換えてから実行
// 実行後に生成されるコードから、schema行の削除と、Optionalを削除する
npx sequelize-auto -o "./models" -d [データベース名] -h [ホスト名] -u [ユーザー名] -x [パスワード] -p 1433 -e mssql --lang ts --caseModel p --caseFile c --caseProp c

DAOの作成

./dao/userInfoDao.tsを作成し、下記のコードをコピペ

import { UserInfo } from '../models/userInfo';

export class UserInfoDAO {

  // コンストラクタでモデルを受け取る
  constructor(private userInfoModel: typeof UserInfo) {}

  // ユーザー情報を全件取得
  public async getAllUsers(): Promise<UserInfo[]> {
    try {
      console.log("ここからgetAllUsersを実行開始")
      return await this.userInfoModel.findAll();
    } catch (error) {
      console.error('Error fetching users:', error);
      throw error;
    }
  }

  // Daoファイルとの疎通テスト用
  public testDaoCode(): string {
    try {
      const aaa: string = "test dao zzz";
      return aaa;
    } catch (error) {
      console.error('Error fetching users:', error);
      throw error;
    }
  }
}

DAOを呼び出すserviceの作成

./src/service/test.tsの中身を下記のように修正

import { Request, Response } from "express";
import { UserInfoDAO } from "../../dao/userInfoDao";
import { UserInfo } from "../../models/userInfo";

const dao = new UserInfoDAO(UserInfo);

// DAO関係なしの関数
export const testGet = (req: Request, res: Response) => {
    res.status(200).json({ message: 'router test' });
};

// DAOを呼び出す関数
export const testDaoUsers = async (req: Request, res: Response) => {
    const users = await dao.getAllUsers();
    console.log(users);
    res.status(200).json({ message: 'test DAO users' });
};

routesの設定

import express from "express";
import { testDaoUsers, testGet } from "../service/test";

const router = express.Router();
router.get('/api/test', testGet); // DAO関係なしのAPI
router.get('/api/users', testDaoUsers) // DAOを呼び出すAPI

export default router;

db接続の情報

./db/databaseAdvisor.tsを作成し、下記のように作成をする。(本来ならdotenvを用いて.envから読み取る)

import { Sequelize } from "sequelize";

export const sequelize = new Sequelize(
    'DB名',
    'ユーザー名',
    'パスワード',
    {
        host: 'localhost',
        dialect: 'mssql'
    }
);

index.tsの修正

import { Request, Response } from "express";
import router from "./routes/routes";
import { UserInfo } from "../models/userInfo";
import { sequelize } from "../db/databaseAdvisor";

const express = require('express');
const cors = require('cors');

// ここでsequelizeを初期化
UserInfo.initModel(sequelize);

const app = express();
const port = 5000;

// CORSを有効にする(フロントエンドとバックエンドが異なるポートで動作するため)
app.use(cors());

app.use(express.json());

app.use('/', router);

app.listen(port, () => {
  console.log(`Server is running at http://localhost:${port}`);
});

module.exports = app
⚠️ **GitHub.com Fallback** ⚠️