前言
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