Koa
Koa是一個新的web框架,由Express幕后的原班人馬打造,致力於成為web應用和API開發領域中的一個更小、更富有表現力、更健壯的基石。
Koa相對於Express有幾個顯著的特點。
- Koa中間件選擇了洋蔥模型。
- Koa除了Express的Request和Response兩個對象外,增加了Context對象。
- 將捕獲異常中間件放在其他中間件之間,就可以捕獲到它們的異常了。
中間件洋蔥模型

中間件執行順序:

每個中間件就像是洋蔥的一層,所有的請求經過一個中間件都會執行兩次,這樣可以非常方便的后置處理邏輯。
Egg.js
Egg.js為企業級框架和應用而生,我們希望由Egg孕育出更多上層框架,幫助開發團隊和開發人員降低開發和維護成本。
Egg不直接提供功能,只是集成各種功能插件。簡單來說,就一個詞,那就是輕量化。
Egg是基於Koa開發的,選擇其作為基礎框架,在它的模型基礎上,進行了一些增強。
- 擴展
在基於Egg的框架或者應用中,我們可以定義app/extend/{application, context, request, response}.js來擴展Koa中對應的四個對象的原型,這樣我們就可以快速的增加更多的輔助方法。
- 插件
一個插件可以包含extend,middleware,config。extend擴展基礎對象的上下文,提供各種工具類、屬性。mdidleware增加一個或多個中間件,提供請求的前置、后置處理邏輯。config配置各個環境下插件自身的默認配置項。
第一個項目
使用腳手架可以快速生成項目。
npm init egg --type=simple
egg項目文件結構規范。
egg-project
├── package.json
├── app.js (可選)
├── agent.js (可選)
├── app
| ├── router.js
│ ├── controller
│ | └── home.js
│ ├── service (可選)
│ | └── user.js
│ ├── middleware (可選)
│ | └── response_time.js
│ ├── schedule (可選)
│ | └── my_task.js
│ ├── public (可選)
│ | └── reset.css
│ ├── view (可選)
│ | └── home.tpl
│ └── extend (可選)
│ ├── helper.js (可選)
│ ├── request.js (可選)
│ ├── response.js (可選)
│ ├── context.js (可選)
│ ├── application.js (可選)
│ └── agent.js (可選)
├── config
| ├── plugin.js
| ├── config.default.js
│ ├── config.prod.js
| ├── config.test.js (可選)
| ├── config.local.js (可選)
| └── config.unittest.js (可選)
└── test
├── middleware
| └── response_time.test.js
└── controller
└── home.test.js
app/router.js,用於配置URL路由規則。app/controller/**,用於解析用戶的輸入,處理后返回相應的結果。app/service/**,用於編寫業務邏輯層,可選。app/middleware/**,用於編寫中間件。app/public/**,用於放置靜態資源。app/extend/**,用於擴展框架。config/config.{env}.js,用於編寫配置文件。config/plugin.js用於配置需要加載的插件。test/**,用於單元測試。app.js和agent.js,用於自定義啟動時的初始化工作,可選。#
初始化項目后,直接使用npm run dev啟動項目,在localhost:7001就可以看到。

連接數據庫
使用sequelize連接數據庫,首先安裝egg-sequelize和mysql2。
npm install --save egg-sequelize mysql2
在config/plugin.js中啟用eggsequelize插件。
// config/plugin.js
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
};
在config/config.default.js中添加sequelize配置。
// config/config.default.js
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
port: 3306,
database: 'egg-sequelize-doc-default',
username: 'root',
password: 'w123456',
}
在數據庫中創建表並插入數據。

在app/model/user.js中編寫代碼實現業務邏輯。
// app/model/user.js
'use strict';
module.exports = app => {
const {
STRING,
INTEGER,
} = app.Sequelize;
const User = app.model.define('user', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
name: STRING(50),
sex: STRING(4),
pass: STRING(32),
}, {
freezeTableName: true,
timestamps: false,
});
return User;
};
這個Model就可以在Controller和Service中通過app.model.User訪問,編寫Controller調用這個Model。
// app/controller/user.js
'use strict';
const Controller = require('egg').Controller;
class UserController extends Controller {
async index() {
const _ctx = this.ctx;
const user = await _ctx.model.User.findAll();
_ctx.body = user;
}
}
module.exports = UserController;
將controller掛載到路由上。
// app/router.js
module.exports = app => {
const { router, controller } = app;
router.resources('users', '/users', controller.users);
};
使用npm run dev命令啟動項目。在localhost:7001/user看到數據庫中的數據。

訪問成功!

