egg-sequelize-ts 插件

egg-sequelize-ts plugin

目的 (Purpose)

能让使用 typescript 编写的 egg.js 项目中能够使用 sequelize方法,并同时得到egg.js所赋予的功能。

说明 (Description)

this plugin use sequelize-typescript replace with sequelize in egg.js. at the same time, make sure of user

插件只是将 egg-sequelize 中的 sequelize 替换为 sequelize-typescript, 同时保证用户在 egg.js 创建的项目中使用 egg-sequelize 的方法尽量一致,在使用时的不同,我将下面一一阐述。 其他内容部分请查看 egg-sequelize
此插件已在生产项目中得到实践。

安装 (Install)

$ npm i --save egg-sequelize-ts
$ yarn add egg-sequelize-ts

配置 (Config)

  • Enable plugin in config/plugin.js
  • config/plugin.js 文件中引入 egg-sequelize-ts 组件
exports.sequelize = {
    enable: true,
    package: 'egg-sequelize-ts'
}
  • Edit your own configurations in conif/config.{env}.js
    conif/config.{env}.js 中编写 sequelize 配置
    config.sequelize = {
        dialect: 'mysql',
        host: '127.0.0.1',
        port: 3306,
        database: 'database'
    };

例子 (Example)

分别以 model/user.js 和 service/user.js 举例说明

note 注意我们都是从 sequelize-typescript 中导出类名,方法,属性等。

// app/model/user.js

/**
 * @desc 用户表
 */
import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table } from 'sequelize-typescript';
@Table({
    modelName: 'user'
})
export class User extends Model<User> {

    @PrimaryKey
    @AutoIncrement
    @Column({
        type: DataType.INTEGER(11),
        comment: '用户ID',
        comment: 'user id'
    })
    id: number;

    @Column({
        comment: '用户姓名',
    })
    name: string;

    @Column({
        comment: '用户邮箱'
    })
    email: string;

    @Column({
        comment: '用户手机号码'
    })
    phone: string;

    @Column({
        field: 'created_at'
    })
    createdAt: Date;

    @Column({
        field: 'updated_at'
    })
    updatedAt: Date;
};
export default () => User;

// app/service/user.js
import { Service } from 'egg';
import { Sequelize } from 'sequelize-typescript';

class UserService extends Service {
  async index() {
    const { or } = Sequelize.Op;
    const users = await this.ctx.model.User.findOne({
        where: {
            [or]: [
                { name, phone },
                { id }
            ]
        }
    });
    this.ctx.body = users;
  }
}

更改内容(Major changes)

  1. 替换 index.d.ts 文件中的类型
    主要将 interface 中的Sequelize,model指向 sequelize-typescript.

for example:

- import * as sequelize from "sequelize";
+ import { Sequelize, ISequelizeValidationOnlyConfig } from 'sequelize-typescript';
 declare module 'egg' {
+  // 便于egg 将方法挂载到IModel上
+  interface IModel extends Sequelize { }

 interface Application {
 -   Sequelize: sequelize.SequelizeStatic;
 -   model: sequelize.Sequelize;
 +   Sequelize: Sequelize;
 +   model: IModel;
  }
}

了解详情,请点击commit

  1. 替换loader.js中的内容
  • 使用('sequelize-typescript').Sequelize替换sequelize

  • filter(model) 中使用findAll 替换sequelize,因为seq-ts在执行addModels才会有 sequelize

  • seq-ts需要手动添加models

    sequelize.addModels(models);
    

    了解详情,请点击commit

    如果对您有帮助,欢迎 star 和推荐 (✿◡‿◡)

posted @ 2019-08-12 20:16  stone-lyl  阅读(2368)  评论(0编辑  收藏  举报