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 dotenv sequelize tedious
npm install --save-dev sequelize-typescript sequelize-cli sequelize-auto
下記の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/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;
}
}
}
./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' });
};
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/databaseAdvisor.tsを作成し、下記のように作成をする。(本来ならdotenvを用いて.envから読み取る)
import { Sequelize } from "sequelize";
export const sequelize = new Sequelize(
'DB名',
'ユーザー名',
'パスワード',
{
host: 'localhost',
dialect: 'mssql'
}
);
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