EggJs框架日记(三):插件使用(2)-MySQL及Sequelize

  • 2021年5月18日
  • 技术

mysql不必多说,最常见的关系型数据库之一,而在 Node.js 社区中,Sequelize是一个广泛使用的 ORM 框架,它支持 MySQL、SQLite 和 MSSQL 、PostgreSQL等多个数据源。这两个官方也是有对应写好的插件。

1,MySQL安装使用

首先,引入插件:

npm i --save egg-mysql

接着,在config配置插件:

// config/plugin.js
import { EggPlugin } from 'egg';
const plugin: EggPlugin = {
  mysql: {
    enable: true,
    package: 'egg-mysql',
  },
};
export default plugin;

注意:因为config.default.ts文件里不相关的代码太多,就只放了局部,插件配置统一放在bizConfig就行。

// config/config.default.ts
mysql: {
    // 单数据库信息配置
    client: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: 'root',
        database: 'eggjs',
    },
    app: true,
    agent: false,
},

然后,修改之前的逻辑层:

// app/service/room.ts
/**
 * 获取房间列表
 */
public async list() {
    //分别是两种方式,封装函数和查询
    //const room = await this.app.mysql.select('room_list');
    const room = await this.app.mysql.query('select * from room_list');
    return room;
}

注意这里默认情况下会报错:TS2339: Property ‘mysql’ does not exist on type ‘Application’.

是因目前 egg-mysql 没有写声明,因此在 Application 中是没有 mysql 的声明的,需要自己声明。

处理报错:

// typings/index.d.ts
import 'egg';

declare module 'egg' {
    export interface Application {
        mysql: any
    }
}

控制器调用:

// app/controller/room.ts
const {ctx} = this;
const room = await ctx.service.room.list();
ctx.body = room;

最后,访问路由/api/room/list返回数据。

2,Sequelize安装使用

首先,引入插件:

npm install --save egg-sequelize mysql2

接着,在config配置插件(按格式增加就行):

// config/plugin.js
sequelize: {
    enable: true,
    package: 'egg-sequelize',
},
// config/config.default.ts
sequelize: {
    dialect: 'mysql',
    host: '127.0.0.1',
    port: '3306',
    password: 'root',
    database: 'eggjs',
},

为了防止没有声明报错,手动添加声明:

// typings/index.d.ts
import 'egg';

declare module 'egg' {
    export interface Application {
        mysql: any;
        Sequelize: typeof sequelize;
        model: IModel;
    }
}

然后,定义实体对象:

// app/model/room.ts
import {Application} from 'egg';

export default (app: Application) => {
    const {STRING, INTEGER} = app.Sequelize;
    const Room = app.model.define('room_list', {
        id: {type: INTEGER, primaryKey: true, autoIncrement: true},
        name: STRING(32),
    }, {
        freezeTableName: true,
        tableName: 'room_list',
        timestamps: false
    });
    return Room;
};

最后,逻辑层查询:

// app/service/room.ts
/**
 * 获取房间列表
 */
public async list() {
    //const room = await this.app.mysql.select('room_list');
    //const room = await this.app.mysql.query('select * from room_list');
    const room = await this.app.model.Room.findAll({limit: 10, offset: 0,order:[["id","desc"]]})
    return room;
}

最后,访问路由/api/room/list返回数据。

这里只是简单的引入插件,配置插件和运行插件,插件更多详细的文档,可以参看官方文档。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注