如何使用 TypeScript 和 Sequelize
Posted
技术标签:
【中文标题】如何使用 TypeScript 和 Sequelize【英文标题】:How to use TypeScript with Sequelize 【发布时间】:2020-05-17 18:31:05 【问题描述】:我已经使用 Fastify 用 Node、PostgreSQL、Sequelize 编写了我的服务器应用程序。
现在我想使用 TypeScript。谁能告诉我如何开始使用 TypeScript 重写我的服务器应用程序。
【问题讨论】:
嘿,这是我找到的最好的解决方案:rousseau-alexandre.fr/en/programming/2019/06/19/… 希望对您有所帮助 【参考方案1】:您应该尽可能避免使用装饰器,它们不是 ECMAScript 标准。他们甚至被认为是遗产。这就是为什么我要向你展示如何将 sequelize 与 typescript 一起使用。
我们只需要关注文档:https://sequelize.org/v5/manual/typescript.html,但不是很清楚,或者至少对我来说不是很清楚。我花了一段时间才明白。
上面说你需要安装这棵树的东西
* @types/node
* @types/validator // this one is not need it
* @types/bluebird
npm i -D @types/node @types/bluebird
然后让我们假设您的项目如下所示:
myProject
--src
----models
------index.ts
------user-model.ts
------other-model.ts
----controllers
----index.ts
--package.json
让我们先创建用户模型
`./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,
,
);
现在只是为了玩箭头,让我们创建 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,
,
);
我们的实体已经完成。现在是数据库连接。
open ./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!
在我们的 index.ts 上添加,如果你只是想打开连接
db.sequelize
.authenticate()
.then(() => logger.info("connected to db"))
.catch(() =>
throw "error";
);
或者如果你想创建他们的表
db.sequelize
.sync()
.then(() => logger.info("connected to db"))
.catch(() =>
throw "error";
);
这样的
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;
再一次,天空是极限。 如果您这样做,您将拥有自动完成的所有功能。 这里是一个例子:https://github.com/EnetoJara/resume-app
【讨论】:
创作作品如何实现?当我做 MyModel.create () 他期望一个对象但不完全是模型的属性 你好,como estas ?你可以看看这篇中号帖子medium.com/@enetoOlveda/… 许多 TypeScript 特性不是 ECMAScript 标准的一部分,这并不意味着它们应该被避免。装饰器绝对不是遗留物,它们是 tc39 第 2 阶段的提案,尚未最终确定。 无论你的船是什么 兼容typescript的模型是否可以从sequelize-cli
构建?就像我们喜欢sequelize-cli model:generate command
?【参考方案2】:
使用 sequelize-typescript。将您的表和视图转换为扩展模型对象的类。
在类中使用注释来定义您的表格。
import Table, Column, Model, HasMany from 'sequelize-typescript';
@Table
class Person extends Model<Person>
@Column
name: string;
@Column
birthday: Date;
@HasMany(() => Hobby)
hobbies: Hobby[];
通过创建对象来创建与数据库的连接:
const sequelize = new Sequelize(configuration...).
然后将您的表注册到此对象。
sequelize.add([Person])
如需进一步参考,请查看此模块。 Sequelize-Typescript
【讨论】:
以上是关于如何使用 TypeScript 和 Sequelize的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 React 和 TypeScript 设置 Electron?
JSPM + TypeScript + PhotoSwipe:如何成功导入和使用库?
如何在 Typescript 中使用 Webpack 'require' 和 'require.ensure'