Egg.js体验
- 全局安装
// 创建项目
$ npm i egg-init -g
$ egg-init egg-example --type=simple
$ cd egg-example
$ npm i// 启动项目
$ npm run dev
$ open localhost:7000

 
 
 
Egg.js的结构
- 路由(Router): 将请求URL和具体承担执行动作的Controller的关系对应
- 控制器(Controller): - Restful: 接收用户的参数,从数据中查找内容返回给用户
- 页面请求: 根据用户访问不同的URL,渲染不同的模板得到HTML返回给用户
- 代理服务器: 将用户的请求转发到其他服务器上.
 
- 服务(Service): - Service就是将复杂业务场景下用于做业务封装的一个抽象层
- 好处: - 保持Controller简洁
- 业务逻辑独立性: 用户业务PCController + MobileController
- 逻辑和展现分离: - 容易编写测试用例
- 无容器依赖对象 (body header)
 
 
 
- 数据库: - mongoose
- sequelize
 
基本使用
- 使用egg-init生成的结构如下
- 自己添加一个Service层
  
- 打开egg-example/app/router.js, 有如下代码:
module.exports = app => {const { router, controller } = app;router.get('/', controller.home.index);
}
- 在这一层,将路由请求/和处理函数controller.home.index对应起来
- controller.home.index其实是对应Controller层.
- 找到Controller(文件夹)下面的文件home.js,打开如下:
  
- 说明: - 使用 const Controller = require('egg').Controller得到egg框架中的Controller基类
- 自定义类继承与Controller基类 class HomeController extends Controller
- 在里面声明了一个异步方法 async index(){...}
- 将自定义的类导出,module.exports = HomeController
 
- 使用 
- 这里的index 对应路由层(Router)中的 controller.home.index
类似的加一个Service层
- 假设是User的服务处
- 首先获得Service的基类 const Service = require('egg').Service
- 自定义子类继承基类const UserService extends Service{...}
- 在里面写一个方法,用于获取所有用户
async getAll(){return [{name:'marron',age:18}]
}
- 导出自己定义的类
- 目录结构自己新建,代码保存于’/egg-example/app/service/user.js’
const Service = require('egg').Service;class UserService extends Service{async getAll() {return [{ name:'marron', age: 18 }]}
}
在Controller层中使用Service层的服务
- 1.首先从this中获取上下文 const {ctx} = this
- 2.Service层中(继承基类Service)的方法全部挂载在ctx.service上
- 调用如下:
'use strict';const Controller = require('egg').Controller;class HomeController extends Controller {async index() {const { ctx } = this;ctx.body = await ctx.service.user.getAll()}
}module.exports = HomeController;
