egg是标准的mvc模型,即为controller控制层,view视图层,module模型。
router主要是分发页面的请求,当访问该页面,将这个请求分发给对应的controller去完成。
//app->router.js
module.exports = app =>{
const { router, controller } = app;
router.get('/', controller.home.index);//此处为访问/地址时分发到controller下home文件中index方法。
router.get('/list', controller.list.index);//此处为访问/地址时分发到controller下list文件中index方法。
router.get('/news', controller.news.list);//此处为访问/地址时分发到controller下news文件中list方法。
}
// app->controller/home.js
const Controller = require('egg').Controller;
class HomeController extends Controller{
async index(){
this.ctx.body = 'Hello world';
}
}
module.exports = HomeController;
//app-<controller/news.js
const Contriller = require('egg').Controller;
class NewsController extends Contriller{
async list(){
const ctx = this.ctx;
const page = ctx.query.page || 1;
const newsList = await ctx.service.news.list(page);//此处对应到service层中service->news.js->list方法
await ctx.render('news/list.html', { list: newsList });//此处对应到view层中view->news->list.html,并且将list作为参数传递到list.html使用
}
}
module.exports = NewsController;
//service->news.js
const Service = require('egg').Service;
class NewsService extends Service {
async list(page = 1) {
const { serverUrl } = this.config.news;//serverUrl从config.default.js中读取news的serverUrl 属性
const res = await this.ctx.curl(`${serverUrl}/title/top` , {
method: "GET",
dataType: "json",//设置返回数据类型为json,如果这里不设置需要将res.data JSON序列化
headers: this.config.headers
});
const result = res.data;
// const result = JSON.parse(res.data)//将res.data转换成json格式
return result.data
}
}
module.exports = NewsService;
//app->view->news->list.html。此处的list是从controller中传过来的list
<html>
<head>
<title>模板</title>
<link rel="stylesheet" href="/public/css/news.css"/>
</head>
<body>
<ol class="news-view view">
{% for item in list %}
<li class="item">
<a href="#">
{% for details in item.list %}
<span>{{details.titleName}}</span>
{% endfor %}
</a>
</li>
{% endfor %}
</ol>
</body>
</html>
config.default.js为egg.js的配置项文件。
Router 则主要用来描述请求 URL 和具体承担执行动作的 Controller 的对应关系, 框架约定了 app/router.js 文件用于统一所有路由规则。
Controller 负责解析用户的输入,处理后返回相应的结果。
Service 就是在复杂业务场景下用于做业务逻辑封装的一个抽象层。
1、保持 Controller 中的逻辑更加简洁。
2、保持业务逻辑的独立性,抽象出来的 Service 可以被多个 Controller 重复调用。
3、将逻辑和展现分离,更容易编写测试用例。
网友评论