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;