egg.js 插件实战

2021-12-05  本文已影响0人  0月

前言

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

安装插件

配置插件

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.png

show dbs

show dbs.png

use article

use article.png

show tables

show tables.png

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

db.users.find()

db.users.find().png

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

总结

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

上一篇 下一篇

猜你喜欢

热点阅读