Skip to content
On this page

访问路由

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

输入 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
javascript
// app/router.js
module.exports = (app) => {
  const { router, controller } = app;
  router.get("/user/:id", controller.user.info);
};
1
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
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

3.5 egg 中视图 (view)

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

沪ICP备20006251号-1