egg-sequelize-ts 外掛

lyl發表於2019-08-12

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 和推薦 (✿◡‿◡)

相關文章