接続typescript express sequelize


注意:NodeJS Express Typeスクリプトを使用してSequelize環境を構築
上のブログ記事を参考にして書きました.
しかし、私はmigrations(大きなプロジェクトでもない)を使用するのが不便なので、modelsディレクトリでモデルを作成し、アプリケーションを作成するだけです.tsは続編を同期する方式を採用した.
邪族です.
従来,プロジェクトを行う過程でサーバはnodejs+sequelize+jsで構成されていたが,typescriptを正しく処理したいため,typescriptとして孔氏プロジェクトを選択して行った.
tsを一生懸命勉強していませんが、タイプを指定することに慣れているので、そんなに難しくありません.
Nest.jsがありますが、プロジェクト完了の残り時間を計算した後、Nestは残念ながら試していません.
いつか、私も最近のことを処理したいです.

n/a.環境


"dependencies": {
"cors": "2.8.5",
"dotenv": "10.0.0",
"express": "4.17.1",
"mysql2": "2.3.3",
"reflect-metadata": "0.1.13",
"sequelize": "6.9.0",
"sequelize-cli": "6.3.0",
"sequelize-typescript": "2.1.1"
},
"devDependencies": {
"@types/cors": "2.8.12",
"@types/express": "4.17.13",
"@types/node": "16.10.3",
"@types/validator": "13.6.6",
"nodemon": "2.0.15",
"ts-node": "10.2.1",
"tsc-watch": "4.5.0",
"typescript": "4.4.3"
}

sequelizeの設定


src/app.ts
ルータはまだ設定されていません.
// src/app.ts
import * as dotenv from "dotenv";
import express, { Response, Request, NextFunction } from "express";
import cors from "cors";

import { sequelize } from "./models";
import User from "./models/user.model";

dotenv.config();
// * APP VARIABLES
const PORT: number = parseInt(process.env.PORT as string, 10) || 5000;
const HOST: string = process.env.HOST || "localhost";
const app: express.Application = express();

// * APP CONFIGURATION: middleware
app.use(cors());
app.use(express.json());
app.use((req: Request, res: Response, next: NextFunction) => {
    console.log(`Request occur! ${req.method}, ${req.url}`);
    next();
});

// TODO ROUTER SETTING

// 5000 포트로 서버 실행
app.listen(PORT, HOST, async () => {
    console.log(`server on: listening on ${HOST}:${PORT}`);
    // sequelize-db connection test
    await sequelize
        .sync({ force: true })
        .then(async () => {
            console.log("seq connection success");
        })
        .catch((e) => {
            console.log("seq ERROR: ", e);
        });
});
src/config/config.ts
dotnv秘密を使用...田野を管理した.
import * as dotenv from "dotenv";
dotenv.config();
const env = process.env;

export const config = {
    development: {
        username: env.MYSQL_USERNAME || "root",
        password: env.MYSQL_PASSWORD,
        database: env.MYSQL_DATABASE || "gongcdb",
        host: env.MYSQL_HOST || "localhost",
        dialect: "mysql",
        port: env.MYSQL_PORT || "3306",
    },
};
tsconfig.json
これをしないと間違いになる
// ...생략...
"experimentalDecorators": true
// ...생략...

モデルの定義


ここにはたくさんの間違いがあった.

src/model/user.model.ts**

import {
    Table,
    Column,
    Model,
    AllowNull,
    Unique,
    DataType,
} from "sequelize-typescript";

@Table({ timestamps: false })
export default class User extends Model {
    // id는 자동으로 auto_increment, primarykey 설정된 채로 추가됨.
	  @AllowNull(false)
    @Unique(true)
    @Column(DataType.STRING)
    public email!: string;

    @AllowNull(false)
    @Column(DataType.STRING)
    public password!: string;

    @AllowNull(false)
    @Column(DataType.STRING)
    public nickname!: string;

    @Unique(true)
    @AllowNull(true)
    @Column(DataType.STRING)
    public rasp_token!: string | null;

    @Unique(true)
    @AllowNull(true)
    @Column(DataType.STRING)
    public android_token!: string | null;
}
このとき、一番大切なのは@Columnアクセサリーを一番下に置くこと!
下図のように@Column Decoratorを一番下に置いて、適当に置いておくとエラーが少なくなります.
export default class User extends Model {
    @Column(DataType.STRING)
    @AllowNull(false)
    @Unique(true)
    public email!: string;
		// ... 생략
}

// 에러 메시지
// throw new Error(`@Column annotation is missing for "${propertyName}" of class "${target.constructor.name}"` +
//               ^
// Error: @Column annotation is missing for "email" of class "User" or annotation order is wrong.

注意:https://github.com/RobinBuschmann/sequelize-typescript/issues/692

src/model/index.ts

import { Sequelize } from "sequelize-typescript";
import { config } from "../config/config";

export const sequelize = new Sequelize(
    config.development.database,
    config.development.username,
    config.development.password,
    {
        host: config.development.host,
        dialect: "mysql",
        models: [__dirname + "/**/*.model.ts"],
    }
);

じっけん


src/app.ts

// src/app.ts
import * as dotenv from "dotenv";
import express, { Response, Request, NextFunction } from "express";
import cors from "cors";

import { sequelize } from "./models";
import User from "./models/user.model";

dotenv.config();
// * APP VARIABLES
const PORT: number = parseInt(process.env.PORT as string, 10) || 5000;
const HOST: string = process.env.HOST || "localhost";
const app: express.Application = express();

// * APP CONFIGURATION: middleware
app.use(cors());
app.use(express.json());
app.use((req: Request, res: Response, next: NextFunction) => {
    console.log(`Request occur! ${req.method}, ${req.url}`);
    next();
});

// TODO ROUTER SETTING

// get
app.get("/", (req: Request, res: Response) => {
    res.send("hello express");
});

app.get("/test", (req: Request, res: Response) => {
    // email password nickname rasp_token android_token
    const user = new User({
        email: "[email protected]",
        password: "1111",
        nickname: "안녕",
    });
	
  
    user.save();
		// 이거 안 쓰면 저장 안됨!

    res.status(200).send({ done: true });

    // res.status(400).send({ done: false });
});

// 5000 포트로 서버 실행
app.listen(PORT, HOST, async () => {
    console.log(`server on: listening on ${HOST}:${PORT}`);
    // sequelize-db connection test
    await sequelize
        .sync({ force: true })
        .then(async () => {
            console.log("seq connection success");
        })
        .catch((e) => {
            console.log("seq ERROR: ", e);
        });
});
でもまた間違いがあった
エラー:TypeError: Class constructor model cannot be invoked without 'new'
だから上のオーバーフローの答えのようにtsconfig.jsonに行って設定を次のように変更すればいいです.

tsconfig.json

"target": "ES2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,

コメント


https://github.com/leejin21/gongC