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;