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)
- 替換
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;
}
}
- 替換
loader.js
中的內容
- 使用('sequelize-typescript').Sequelize替換sequelize
- 在
filter(model)
中使用findAll 替換sequelize,因為seq-ts在執行addModels才會有 sequelize seq-ts需要手動新增models
sequelize.addModels(models);
如果對您有幫助,歡迎 star 和推薦 (✿◡‿◡)