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;
