Egg + Mysql + Redis 搭建后端接口

347 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

前置知识:

Egg

Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本,开发人员不再是『钉子』,可以流动起来。没有约定的团队,沟通成本是非常高的,比如有人会按目录分栈而其他人按目录分功能,开发者认知不一致很容易犯错。但约定不等于扩展性差,相反 Egg 有很高的扩展性,可以按照团队的约定定制框架。使用 Loader 可以让框架根据不同环境定义默认配置,还可以覆盖 Egg 的默认约定。

Mysql

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

Redis

Redis 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。


项目中安装:

  "dependencies": {
    "egg-jwt": "^3.1.7",
    "egg-mysql": "^3.0.0",
    "egg-redis": "^2.4.0",
    "egg-sequelize": "^5.2.2",
    "md5": "^2.3.0",
  },

主要是依赖这几项。

在 config / config.default.js 中进行配置。

  config.mysql = {
    app: true,
    agent: false,
    client: {
      host: '127.0.0.1',
      port: '3306',
      user: 'root',
      password: '12345678',
      database: 'campus_song'
    }
  };

  config.sequelize = {
    dialect: 'mysql',
    host: '127.0.0.1',
    port: '3306',
    user: 'root',
    password: '12345678',
    database: 'campus_song',
    define: {
      timestamps: false,
      freezeTableName: true
    }
  };

  config.jwt = {
    secret: 'egg'
  }

  config.redis = {
    client: {
      port: 6379,
      host: '127.0.0.1',
      password: '',
      db: 0
    }
  }

这里面只需要大家按照自己的项目真实信息进行填写,更换其中的密码和数据库名称即可。

同时,需要在 config / plugin.js

exports.mysql = {
  enable: true,
  package: 'egg-mysql'
};

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

exports.jwt = {
  enable: true,
  package: 'egg-jwt'
};

exports.redis = {
  enable: true,
  package: 'egg-redis'
};

app 文件夹目录下,是我们主要编写逻辑的地方。

图片.png

大致可以按照这么来进行划分。

示例:

router.js

'use strict';

module.exports = app => {
  const { router, controller } = app;
  const userExist = app.middleware.userExist();
  // 登录接口
  router.post('/api/user/register', controller.user.register);
};

controller 文件夹下新建 user.js

'use strict';

const md5 = require('md5');
const BaseController = require('./base');

class UserController extends BaseController {
  async register() {
    const { ctx, app } = this;
    const parmas = ctx.params();
    const user = await ctx.service.user.getUser(parmas.username);

    if (user) {
      this.error('用户已经存在');
      return;
    }

    const result = await ctx.service.user.add({
      ...parmas,
      password: md5(parmas.password + app.config.salt),
      createTime: ctx.helper.time()
    });
    if (result) {
      const token = await this.jwtSign({
        id: result.id,
        username: result.username
      });
      this.success({
        ...this.parseResult(ctx, result),
        token
      });
    } else {
      this.error('注册使用失败');
    }
  }
}

module.exports = UserController;

service 文件夹下新建 user.js

'use strict';

const md5 = require('md5');
const BaseService = require('./base');

class UserService extends BaseService {
  async getUser(username, password) {
    return this.run(async () => {
      const { ctx, app } = this;
      const _where = password ? { username, password: md5(password + app.config.salt) } : { username };
      const result = await ctx.model.User.findOne({
        where: _where
      });
      return result;
    });
  }

  async add(params) {
    return this.run(async () => {
      const { ctx } = this;
      const result = await ctx.model.User.create(params);
      return result;
    });
  }
}

module.exports = UserService;

modal 文件夹下新建 user.js

module.exports = app => {
  const { STRING, INTEGER, TEXT, DATE } = app.Sequelize;

  const User = app.model.define('user', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    username: STRING(20),
    password: STRING(64),
    rea_name: STRING(20),
    avatar: TEXT('long'),
    phone: STRING(20),
    email: STRING(20),
    gender: STRING(20),
    school: STRING(20),
    academy: STRING(20),
    class: STRING(20),
    sign: STRING(300),
    createTime: DATE,
    updateTime: DATE
  });

  return User;
}

这样,基本的注册功能,已经可以使用了。使用 postman 可以进行一下测试。

图片.png

这边有一个已经封装好的项目,大家可以下载下来运行一下。在运行之前,请打开本地的 mysql 和 redis。

👉👉👉👉:gitee.com/suiboyu/egg…