Egg-Ts

1,220 阅读3分钟

01_创建Ts类型Egg项目

官方文档 eggjs.org/zh-cn/tutor…

01-安装Egg脚手架

npm i egg-init -g

02-通过Egg脚手架创建Egg-Ts项目

egg-init 项目名称 --type=ts

03-进入项目

cd 项目名称
npm i

04-测试

npm run dev

05-效果图

image.png

02_使用Ts操作Sequelize

官方文档 eggjs.org/zh-cn/tutor…

01-安装插件

npm install --save egg-sequelize mysql2
npm install --save-dev @types/node @types/validator
npm install sequelize reflect-metadata sequelize-typescript
# 这里我安装的是1的版本,因为2的版本我后续编写的代码报错了,我也一直无法解决
# 所以这里我就使用1的版本,具体原因还需后续研究
# 如果有知道的大佬可以指导我一下
npm i sequelize-typescript
npm i --save egg-sequelize-ts

02-配置插件

在 config/plugin.js 中引入 egg-sequelize-typescript 插件

exports.sequelize = {
    enable: true,
    package: 'egg-sequelize-ts'
}

在 config/config.default.js 中编写 sequelize 配置

# 这里我在config.local.ts(开发阶段)文件中进行配置
# 这里我再进行了额外的配置(用户名,密码)
  config.sequelize = {
    dialect: 'mysql',
    host: '127.0.0.1',
    port: 3306,
    usename:'root',
    password:'root',
    database: 'sandy',
  };

03-编写代码

需要我们来在 app/model/ 目录下编写代码

import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table } from 'sequelize-typescript';
@Table({
  // 配置
    modelName: 'persons'
})
export class User extends Model<User> {

  // 快捷装饰器(如果要使用快捷装饰器,必须把装饰器放在Column的前面)
    @PrimaryKey
    @AutoIncrement
    @Column({
      // 支持类型推断
        // type: DataType.INTEGER,
        comment: '用户ID',
    })
    id: number;

    @Column({
        type: DataType.STRING,
        comment: '用户姓名',
    })
    name: string;
};
export default () => User;
# 在路由中配置一下路径

import { Application } from 'egg';

export default (app: Application) => {
  const { controller, router } = app;

  router.get('/', controller.home.index);
};
# 在控制器中配置一下方法

import { Controller } from 'egg';

export default class HomeController extends Controller {
  public async index() {
    const { ctx } = this;
    ctx.body = await ctx.model.User.findAll();
  }
}

04-效果图

image.png

03_扩展

大部分来说Egg-Ts和Sequelize-Ts一样,只需要照着官方文阅读使用就可以了

但是因为Sequelize不是使用Ts来写的,所以在整合的时候需要大量的配置和修改

这里我就推荐另外一个ORM框架: TypeORM typeorm.biunav.com/zh/

TypeORM是使用Ts编写的,所以在集成使用的时候非常简单

但是TypeORM比较新,还是存在一些坑,遇到坑的时候相关的资料也不是很多,所以暂时不适合企业开发

Sequelize比较成熟稳定,适合企业级开发

04_Sequelize-cli

01-安装插件

npm install --save-dev sequelize-cli

02-编写代码

# 需要我们在项目根目录下新建一个 .sequelizerc 配置文件
'use strict';

const path = require('path');

module.exports = {
  config: path.join(__dirname, 'database/config.json'),
  'migrations-path': path.join(__dirname, 'database/migrations'),
  'seeders-path': path.join(__dirname, 'database/seeders'),
  'models-path': path.join(__dirname, 'app/model'),
};

03-初始化 Migrations 配置文件和目录

npx sequelize init:config
npx sequelize init:migrations

04-修改数据库配置

# 执行完后会生成 database/config.json 文件和 database/migrations 目录
# 我们修改一下 database/config.json 中的内容,将其改成我们项目中使用的数据库配置

{
  "development": {
    "username": "root",
    "password": null,
    "database": "egg-sequelize-doc-default",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "egg-sequelize-doc-unittest",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

05-配置表

npx sequelize migration:generate --name=init-表的名称

# 执行完后会在 database/migrations 目录下生成一个 migration 文件(${timestamp}-init-users.js)
# 我们修改它来处理初始化 users 表
# 因为当前我们开发的是Ts的项目
# 所以要把js文件改为ts
# 默认执行js代码是可以的,当然为了规范也可以编写ts代码
'use strict';

module.exports = {
  // 在执行数据库升级时调用的函数,创建 users 表
  up: async (queryInterface, Sequelize) => {
    const { INTEGER, DATE, STRING } = Sequelize;
    await queryInterface.createTable('users', {
      id: { type: INTEGER, primaryKey: true, autoIncrement: true },
      name: STRING(30),
      age: INTEGER,
      created_at: DATE,
      updated_at: DATE,
    });
  },
  // 在执行数据库降级时调用的函数,删除 users 表
  down: async queryInterface => {
    await queryInterface.dropTable('users');
  },
};

06-创建表

npx sequelize db:migrate

07-效果图

image.png