egg在设计完全符合比较好的mvc的设计模式。

3.1 那么什么是mvc呢?

全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。
在egg中视图 (view)、控制器(controller) 和数据模型 Model(Service) 和配置文件(config)

###

3.2 控制器(controller)

  • app/controller 目录下面实现 Controller
1
2
3
4
5
6
7
8
9
10
11
12
// app/controller/home.js

const Controller = require('egg').Controller;

class HomeController extends Controller {
async index() {
const { ctx } = this;
ctx.body = 'hi, world';
}
}

module.exports = HomeController;

输入 npm run dev
查看 http://127.0.0.1:7001
输出 hi, world

我认为控制器就是一个接口,他管理输入和输出

*同样你可以在app/controller 目录下 写很多个这样个js的,来代表接口

3.3 路由(Router)

主要用来描述请求 URL 和具体承担执行动作的 Controller 的对应关系, 框架约定了 app/router.js 文件用于统一所有路由规则。

现在很多单页面,都是存在相对于的路由,你写个js,同样就要写一个路由

1
2
3
4
5
6
7
8
9
// app/controller/user.js
class UserController extends Controller {
async info() {
const { ctx } = this;
ctx.body = {
name: `hello ${ctx.params.id}`,
};
}
}
1
2
3
4
5
// app/router.js
module.exports = app => {
const { router, controller } = app;
router.get('/user/:id', controller.user.info);
};

3.4 数据模型 Model(Service)

简单来说,Service 就是在复杂业务场景下用于做业务逻辑封装的一个抽象层,提供这个抽象有以下几个好处:

  • 保持 Controller 中的逻辑更加简洁。
  • 保持业务逻辑的独立性,抽象出来的 Service 可以被多个 Controller 重复调用。
  • 将逻辑和展现分离,更容易编写测试用例。
1
2
3
4
5
6
7
8
9
10
11
// app/service/user.js
const Service = require('egg').Service;

class UserService extends Service {
async addName(name) {
const user = `你好,${name}`;
return user;
}
}

module.exports = UserService;
1
2
3
4
5
6
7
8
// app/controller/user.js
class UserController extends Controller {
async info() {
const { ctx } = this;
const userInfo = await ctx.service.user.addName('wjw');
ctx.body = userInfo;
}
}

3.5 egg中视图 (view)

egg中的模板渲染,但是我认为前端后端分离的设计,更加有利于作为服务型架构设计,所以这边不描述view的构造