Egg.JS学习

2019-06-13  本文已影响0人  AcessCors

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、将逻辑和展现分离,更容易编写测试用例。

上一篇 下一篇

猜你喜欢

热点阅读