Appearance
访问路由
egg 在设计完全符合比较好的 mvc 的设计模式。
那么什么是 mvc 呢?
全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范。
在 egg 中视图 (view)、控制器(controller) 和数据模型 Model(Service) 和配置文件(config)
控制器(controller)
app/controller
目录下面实现 Controller
javascript
// 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;
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
输入 npm run dev 查看 http://127.0.0.1:7001 输出 hi, world
我认为控制器就是一个接口,他管理输入和输出
*同样你可以在 app/controller 目录下 写很多个这样个 js 的,来代表接口
3.3 路由(Router)
主要用来描述请求 URL 和具体承担执行动作的 Controller 的对应关系, 框架约定了 app/router.js
文件用于统一所有路由规则。
现在很多单页面,都是存在相对于的路由,你写个 js,同样就要写一个路由
javascript
// 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
6
7
8
9
2
3
4
5
6
7
8
9
javascript
// app/router.js
module.exports = (app) => {
const { router, controller } = app;
router.get("/user/:id", controller.user.info);
};
1
2
3
4
5
2
3
4
5
3.4 数据模型 Model(Service)
简单来说,Service 就是在复杂业务场景下用于做业务逻辑封装的一个抽象层,提供这个抽象有以下几个好处:
- 保持 Controller 中的逻辑更加简洁。
- 保持业务逻辑的独立性,抽象出来的 Service 可以被多个 Controller 重复调用。
- 将逻辑和展现分离,更容易编写测试用例。
javascript
// 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
9
10
11
2
3
4
5
6
7
8
9
10
11
javascript
// app/controller/user.js
class UserController extends Controller {
async info() {
const { ctx } = this;
const userInfo = await ctx.service.user.addName("wjw");
ctx.body = userInfo;
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3.5 egg 中视图 (view)
egg 中的模板渲染,但是我认为前端后端分离的设计,更加有利于作为服务型架构设计,所以这边不描述 view 的构造