简体   繁体   English

如何在 Sequelize 中使用 TypeScript

[英]How to use TypeScript with Sequelize

I already have my server application written in Node, PostgreSQL, Sequelize using Fastify.我已经使用 Fastify 用 Node、PostgreSQL、Sequelize 编写了我的服务器应用程序。

Now I would like to use TypeScript.现在我想使用 TypeScript。 Can anyone tell me how to begin rewriting my Server application using TypeScript.谁能告诉我如何开始使用 TypeScript 重写我的服务器应用程序。

Using Decorators is something you should avoid as much as possible, they are not ECMAScript standard.使用装饰器是你应该尽可能避免的事情,它们不是 ECMAScript 标准。 They are even consider legacy.他们甚至被视为遗产。 It is why I'm going to show you how to use sequelize with typescript.这就是为什么我要向您展示如何在打字稿中使用 sequelize。

we just need to follow the docs: https://sequelize.org/v5/manual/typescript.html but as it is not very clear, or at least to me.我们只需要遵循文档: https : //sequelize.org/v5/manual/typescript.html但因为它不是很清楚,或者至少对我来说。 It took me a while understand it.我花了一段时间才明白。

There it says that you need to install this tree things那里说你需要安装这棵树的东西

 * @types/node
 * @types/validator // this one is not need it
 * @types/bluebird

npm i -D @types/node @types/bluebird

then let's assume your project looks like so:那么让我们假设您的项目如下所示:

myProject
--src
----models
------index.ts
------user-model.ts
------other-model.ts
----controllers
----index.ts
--package.json

Let's create the user model first让我们先创建用户模型

`./src/models/user-model.ts`
import { BuildOptions, DataTypes, Model, Sequelize } from "sequelize";

export interface UserAttributes {
    id: number;
    name: string;
    email: string;
    createdAt?: Date;
    updatedAt?: Date;
}
export interface UserModel extends Model<UserAttributes>, UserAttributes {}
export class User extends Model<UserModel, UserAttributes> {}

export type UserStatic = typeof Model & {
    new (values?: object, options?: BuildOptions): UserModel;
};

export function UserFactory (sequelize: Sequelize): UserStatic {
    return <UserStatic>sequelize.define("users", {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true,
        },
        email: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true,
        },
        name: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        createdAt: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: DataTypes.NOW,
        },
        updatedAt: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: DataTypes.NOW,
        },
    });
}

Now just to play arrow let's create another-model.ts现在只是为了播放箭头让我们创建 another-model.ts

`./src/models/another-model.ts`

import { BuildOptions, DataTypes, Model, Sequelize } from "sequelize";

export interface SkillsAttributes {
    id: number;
    skill: string;
    createdAt?: Date;
    updatedAt?: Date;
}
export interface SkillsModel extends Model<SkillsAttributes>, SkillsAttributes {}
export class Skills extends Model<SkillsModel, SkillsAttributes> {}

export type SkillsStatic = typeof Model & {
    new (values?: object, options?: BuildOptions): SkillsModel;
};

export function SkillsFactory (sequelize: Sequelize): SkillsStatic {
    return <SkillsStatic>sequelize.define("skills", {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true,
        },
        skill: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true,
        },
        createdAt: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: DataTypes.NOW,
        },
        updatedAt: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: DataTypes.NOW,
        },
    });
}

Our Entities are done.我们的实体完成了。 now the db connection.现在数据库连接。

open ./src/models/index.ts there is where we gonna place the seqelize instance打开./src/models/index.ts那里我们将放置 seqelize 实例

`./src/models/index.ts`

import * as sequelize from "sequelize";
import {userFactory} from "./user-model";
import {skillsFactory} from "./other-model";

export const dbConfig = new sequelize.Sequelize(
    (process.env.DB_NAME = "db-name"),
    (process.env.DB_USER = "db-user"),
    (process.env.DB_PASSWORD = "db-password"),
    {
        port: Number(process.env.DB_PORT) || 54320,
        host: process.env.DB_HOST || "localhost",
        dialect: "postgres",
        pool: {
            min: 0,
            max: 5,
            acquire: 30000,
            idle: 10000,
        },
    }
);

// SOMETHING VERY IMPORTANT them Factory functions expect a
// sequelize instance as parameter give them `dbConfig`

export const User = userFactory(dbConfig);
export const Skills = skillsFactory(dbConfig);

// Users have skills then lets create that relationship

User.hasMay(Skills);

// or instead of that, maybe many users have many skills
Skills.belongsToMany(Users, { through: "users_have_skills" });

// the skill is the limit!

on our index.ts add, if you just want to open connection在我们的 index.ts 添加,如果你只是想打开连接

  db.sequelize
        .authenticate()
        .then(() => logger.info("connected to db"))
        .catch(() => {
            throw "error";
        });

or if you want to create them tables或者如果你想创建它们表

  db.sequelize
        .sync()
        .then(() => logger.info("connected to db"))
        .catch(() => {
            throw "error";
        });

some like this有些像这样

 
import * as bodyParser from "body-parser";
import * as express from "express";
import { dbConfig } from "./models";
import { routes } from "./routes";
import { logger } from "./utils/logger";
import { timeMiddleware } from "./utils/middlewares";

export function expressApp () {
    dbConfig
        .authenticate()
        .then(() => logger.info("connected to db"))
        .catch(() => {
            throw "error";
        });

    const app: Application = express();
    if (process.env.NODE_ENV === "production") {
        app.use(require("helmet")());
        app.use(require("compression")());
    } else {
        app.use(require("cors")());
    }

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true, limit: "5m" }));
    app.use(timeMiddleware);
    app.use("/", routes(db));

    return app;
}

Once again the sky is the limit.再一次,天空是极限。 If you do this you'll have all the power of the autocomplete.如果您这样做,您将拥有自动完成功能的所有功能。 here an example: https://github.com/EnetoJara/resume-app这里有一个例子: https : //github.com/EnetoJara/resume-app

Use sequelize-typescript.使用续集打字稿。 Convert your tables and views into a class that extends Model object.将您的表和视图转换为扩展 Model 对象的类。

Use annotations in classes for defining your table.使用类中的注释来定义您的表。

 import {Table, Column, Model, HasMany} from 'sequelize-typescript'; @Table class Person extends Model<Person> { @Column name: string; @Column birthday: Date; @HasMany(() => Hobby) hobbies: Hobby[]; }

Create a connection to DB by creating the object:通过创建对象创建到 DB 的连接:

const sequelize = new Sequelize(configuration...). 

Then register your tables to this object.然后将您的表注册到此对象。

sequelize.add([Person])

For further reference check this module.如需进一步参考,请检查此模块。 Sequelize-Typescript续集打字稿

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM