egg.js 插件实战

前言

egg.js是一个渐进式的nodejs服务端框架,它奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本。

安装插件

  • egg-router-group, 管理路由分组的,如用户模块的接口以/user开头
  • egg-mongoose, 连接mongodb数据库
  • egg-validate, 校验接口请求的参数

配置插件

config/plugin.js里面配置, 开启插件

'use strict';

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

exports.routerGroup = {
  enable: true,
  package: 'egg-router-group',
};

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

mongoose还需要在config/config.default.js配置数据库连接,

  const config = exports = {};
  const userConfig = {
    mongoose: {
      client: {
        url: 'mongodb://127.0.0.1/{你的数据库名}',
        options: {},
      },
    },
  };

  return {
    ...config,
    ...userConfig,
  };

配置之后,自动把变量挂载在this.ctx上面,如
this.ctx.mongoose
this.ctx.routerGroup
this.ctx.validate

使用

app/controller/user.js 用户模块里面register接口使用validate插件来校验用户提交的参数 email password captcha

'use strict';
const BaseController = require('./base');

const createRule = {
  email: { type: 'email' },
  password: { type: 'string' },
  captcha: { type: 'string' },
};

class UserController extends BaseController {
  async login() {}

  async register() {
    const { ctx } = this;
    try {
      ctx.validate(createRule);
    } catch (err) {
      return this.error('参数校验失败', -1, err.errors);
    }

    const { email, password, captcha } = ctx.request.body;
    console.log('校验参数成功-->', { email, password, captcha });
  }
}

module.exports = UserController;

app/router.js 里面通过router.group注册路由组: user

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);

  // user组 以/user开头的api
  router.group({ name: 'user', prefix: '/user' }, router => {
    const {  login, register } = controller.user; // 拿到UserController的方法
    router.post('/login', login);
    router.post('/register', register);
  });
};

在 app/model/user.js里面通过mongoose创建user表的model,

'use strict';

module.exports = app => {
  const mongoose = app.mongoose;
  const userSchema = mongoose.Schema({
    email: { type: 'string', require: true },
    password: { type: 'string', require: true },
    avatar: { type: 'string', require: false, default: '/user.png' },
    nickName: { type: 'string', require: false, default: '' },
  }, { timestamps: true });

  return mongoose.model('User', userSchema);
};

在controller里面直接调用model来插入数据, app/controller/user.js 下的注册接口,接收来自客户端的email password参数然后调用ctx.model.User.create去入库

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

const HashSalt = 'dadouiqwyAAEC12u39j.er3we-erw';
const createRule = {
  email: { type: 'email' },
  password: { type: 'string' },
  captcha: { type: 'string' },
};
class UserController extends BaseController {

  async login() {

  }

  // 注册接口
  async register() {
    const { ctx } = this;
    try {
      ctx.validate(createRule);
    } catch (err) {
      return this.error('参数校验失败', -1, err.errors);
    }
    const { email, password, captcha } = ctx.request.body;
    // 插入一条用户数据 email password
    const res = await ctx.model.User.create({
      email,
      password: md5(password + HashSalt),
    });

    if (res._id) {
      this.message('注册成功');
    }
  }

module.exports = UserController;

通过终端查看本地的mongodb数据库里是否插入成功

  • 执行mongo进入连接数据库

mongo

mongo.png
  • 显示数据库

show dbs

show dbs.png
  • 选择数据库

use article

use article.png
  • 显示当前数据库有多少表 show tables 或者 show collections

show tables

show tables.png

可以看到我们的数据表users ,查表 db.users.find()

db.users.find()

db.users.find().png

可以看到我们插入的一条用户记录

总结

本次插件实战时演示了服务端开发的常规mvc架构流程:

  • 数据从客户端到数据库: view -> controller -> model
  • 数据从数据库到客户端: model -> controller -> view

你可能感兴趣的:(egg.js 插件实战)