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返回数据。
这里只是简单的引入插件,配置插件和运行插件,插件更多详细的文档,可以参看官方文档。