Skip to content

数据库操作(框架自带) - Mysql

1. 安装

bash
npm install egg-mysql --save

2. 配置

  • 插件
js
// config/plugin.js
exports.mysql = {
  enable: true,
  package: "egg-mysql",
};
  • 默认
js
// config/config.default.js
exports.mysql = {
  // 单数据库信息配置
  client: {
    // host
    host: "localhost",
    // 端口号
    port: "3306",
    // 用户名
    user: "root",
    // 密码
    password: "123456",
    // 数据库名
    database: "test",
  },
  // 是否加载到 app 上,默认开启
  app: true,
  // 是否加载到 agent 上,默认关闭
  agent: false,
};
  • Mysql 可能会报错误
bash

ERROR 5954 nodejs.ER_NOT_SUPPORTED_AUTH_MODEError: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

INFO

是因为你使用了 MySQL 8.x 版本,而 egg-mysql 依赖了 ali-rds 这个包,这是阿里自己封装的包,里面又依赖了 mysql 这个包,而这个包已经废弃,不支持 caching_sha2_password 加密方式导致的。可以在 MySQL workbench 中运行下面的命令来解决:

bash

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
flush privileges

3.使用

路由

  • 增加路由 router.js
js
router.post("/database", controller.database.getcontent);
router.post("/database/insert", controller.database.insert);
router.post("/database/update", controller.database.update);
router.post("/database/del", controller.database.del);

Controller 层

  • 新建一个文件controller/database.js
js
const Controller = require("egg").Controller;

class StudentController extends Controller {
  async getcontent() {
    const ctx = this.ctx;
    const result = await ctx.service.database.getcontent(ctx.request.body.id);
    ctx.body = {
      status: 200,
      data: result,
    };
  }

  async insert() {
    const { ctx } = this;
    const { result } = await ctx.service.database.InsertInfo(ctx.request.body);
    if (result.affectedRows == 1) {
      ctx.body = {
        status: 200,
        data: "插入成功",
      };
    } else {
      ctx.body = {
        status: 200,
        data: "插入失败",
      };
    }
  }
  async update() {
    const { ctx } = this;
    const result = await ctx.service.database.update(ctx.request.body);
    ctx.body = {
      status: 200,
      data: result,
    };
  }
  async del() {
    const { ctx } = this;
    const { result } = await ctx.service.database.del(ctx.request.body);
    if (result.affectedRows === 1) {
      ctx.body = {
        status: 200,
        data: "删除成功",
      };
    } else {
      return {
        status: 200,
        data: "删除失败",
      };
    }
  }
}

module.exports = StudentController;

Service 层

  • 新建一个文件service/database.js
js
"use strict";
const Service = require("egg").Service;
class DataBaseService extends Service {
  // 更新数据
  async update(data) {
    try {
      const result = await this.app.mysql.update("student_score", data, {
        where: { number: data.number },
      });
      return result;
    } catch (err) {
      return { err };
    }
  }
  // 获取数据
  async getcontent(id) {
    try {
      const result = await this.app.mysql.select("student_score", {
        where: { number: id },
        columns: ["subject", "score"],
      });
      // const result = await this.app.mysql.query(
      //   `select * from student_score where number> ${id}  `
      // );
      return { result };
    } catch (err) {
      return { err };
    }
  }
  // 插入数据
  async InsertInfo(data) {
    try {
      const result = await this.app.mysql.insert("student_score", data);
      return { result };
    } catch (err) {
      return { err };
    }
  }
  // 删除数据
  async del(data) {
    try {
      const result = await this.app.mysql.delete("student_score", {
        number: data.number,
      });
      return { result };
    } catch (err) {
      return { err };
    }
  }
}
module.exports = DataBaseService;
  • 也可以直接用 mysql 语句
js
const results = await this.app.mysql.query(
  "update data_person set age = (age + ?) where person_id = ?",
  [5, personId]
);

使用的时候 直接传参数掉接口即可