egg-mysql操作数据库,实际开发中会使用 sequelize ORM来操作数据库,不会使用 sql语句来直接操作数据库;
egg-mysql作为了解即可。
egg-mysql文档 https://www.eggjs.org/zh-CN/tutorials/mysql#egg-mysql

安装 egg-mysql

  1. yarn add egg-mysql

plugin.js配置

src/config/plugin.js

  1. exports.mysql = {
  2. enable: true,
  3. package: 'egg-mysql',
  4. };

config.defaut.js配置

src/config/config.default.js 配置 mysql连接

  1. config.mysql = {
  2. app: true, // 将 mysql挂载到 app下面, app.mysql
  3. agent: false,
  4. client: {
  5. host: '127.0.0.1',
  6. port: '3306',
  7. user: 'root',
  8. password: 'root',
  9. database: 'qixiu',
  10. },
  11. };
  • app: true, 将 mysql属性挂载到app下 this.app.mysql

Services查询数据库

app.mysql 查询数据库

  1. 'use strict';
  2. const { Service } = require('egg');
  3. const dbName = 'blog';
  4. class UserService extends Service {
  5. // 查询整张表
  6. async list() {
  7. const {mysql} = this.app;
  8. return await mysql.select(dbName);
  9. }
  10. // 查询一条数据
  11. async findOne(id) {
  12. const {mysql} = this.app;
  13. return await mysql.get(dbName, {id});
  14. }
  15. // 新增数据 insert into
  16. async add(params) {
  17. const {mysql} = this.app;
  18. return await mysql.insert(dbName, params);
  19. }
  20. // 新增数据 insert into
  21. async update(params) {
  22. const {mysql} = this.app;
  23. return await mysql.update(dbName, params);
  24. }
  25. // 删除数据 delete
  26. async del(id) {
  27. const {mysql} = this.app;
  28. return await mysql.delelte(dbName, {id});
  29. }
  30. }

Controller

  1. 'use strict';
  2. const { Controller } = require('egg');
  3. class UserController extends Controller {
  4. async list() {
  5. const {ctx} = this;
  6. const res = await ctx.service.user.list();
  7. ctx.body = {
  8. code: 0,
  9. data: res,
  10. };
  11. }
  12. // /api/list/23
  13. async findOne() {
  14. const {ctx} = this;
  15. const res = await ctx.service.user.findOne(ctx.params.id);
  16. ctx.body = {
  17. code: 0,
  18. data: res,
  19. };
  20. }
  21. // 新增数据,没有id insert into
  22. async add(params) {
  23. const {ctx} = this;
  24. const validateRule = {
  25. title: {type: 'string'},
  26. content: {type: 'string'}
  27. }
  28. ctx.validate(validateRule);
  29. // 插入一条数据
  30. const res = await ctx.service.user.add(ctx.request.body);
  31. ctx.body = {
  32. code: 0,
  33. data: res,
  34. };
  35. }
  36. // 新增数据,有id insert into
  37. async update(params) {
  38. const {ctx} = this;
  39. const validateRule = {
  40. id: {type: 'number'},
  41. title: {type: 'string'},
  42. content: {type: 'string'}
  43. }
  44. ctx.validate(validateRule);
  45. // put更新数据
  46. const res = await ctx.service.user.add(ctx.request.body);
  47. ctx.body = {
  48. code: 0,
  49. data: res,
  50. };
  51. }
  52. // 删除一条数据
  53. async del() {
  54. const {ctx} = this;
  55. const res = await ctx.service.user.del(ctx.params.id);
  56. ctx.body = {
  57. code: 204,
  58. };
  59. }
  60. }

put和 patch的区别

  • put和 patch都是更新操作
  • put要求前端提供的一定是一个完整的资源对象,如果你用了put,但却没有提供完整的UserInfo,那么缺了的那些字段应该被清空
  • patch 局部更新,后端仅更新接收到的字段。
  • PATCH:更新部分资源,非幂等,非安全
  • PUT:更新整个资源,具有幂等性,非安全

幂等性:多次请求的结果和请求一次的结果一样
安全性:请求不改变资源状态