接続typescript express sequelize
36512 ワード
注意:NodeJS Express Typeスクリプトを使用してSequelize環境を構築
上のブログ記事を参考にして書きました.
しかし、私はmigrations(大きなプロジェクトでもない)を使用するのが不便なので、modelsディレクトリでモデルを作成し、アプリケーションを作成するだけです.tsは続編を同期する方式を採用した.
邪族です.
従来,プロジェクトを行う過程でサーバはnodejs+sequelize+jsで構成されていたが,typescriptを正しく処理したいため,typescriptとして孔氏プロジェクトを選択して行った.
tsを一生懸命勉強していませんが、タイプを指定することに慣れているので、そんなに難しくありません.
Nest.jsがありますが、プロジェクト完了の残り時間を計算した後、Nestは残念ながら試していません.
いつか、私も最近のことを処理したいです.
"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"
}
src/app.ts
ルータはまだ設定されていません.
dotnv秘密を使用...田野を管理した.
これをしないと間違いになる
ここにはたくさんの間違いがあった.
下図のように@Column Decoratorを一番下に置いて、適当に置いておくとエラーが少なくなります.
注意:https://github.com/RobinBuschmann/sequelize-typescript/issues/692
エラー:TypeError: Class constructor model cannot be invoked without 'new'
だから上のオーバーフローの答えのようにtsconfig.jsonに行って設定を次のように変更すればいいです.
https://github.com/leejin21/gongC
上のブログ記事を参考にして書きました.
しかし、私は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.tsdotnv秘密を使用...田野を管理した.
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
Reference
この問題について(接続typescript express sequelize), 我々は、より多くの情報をここで見つけました https://velog.io/@tera_geniel/typescript-와-express와-sequelize-연결하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol