一. Eggjs是什麼?javascript
Eggjs是一個基於Koajs的框架,因此它應當屬於框架之上的框架,它繼承了Koajs的高性能優勢,同時又加入了一些約束與開發規範,來規避Koajs框架自己的開發自由度過高的問題。前端
Koajs是一個nodejs中比較基層的框架,它自己沒有太多約束與規範,自由度很是高,每個開發者實現本身的服務的時候,都有本身的「騷操做」。而egg爲了適應企業開發,加了一些開發時的規範與約束,從而解決Koajs這種自由度太高而致使不適合企業內使用的缺點,Egg便在這種背景下誕生。java
Egg是由阿里巴巴團隊開源出來的一個「蛋」,爲何是個蛋?蛋是有無限可能的,雞孵出的蛋生小雞,恐龍孵出來的蛋就是恐龍,這也正更好的體現了egg最大的一個亮點「插件機制」,每一個公司每一個團隊甚至單個開發者均可以在這之上孵化出最適合本身的框架。像阿里內部不一樣的部門之間都孵化出了合適本身的egg框架,如螞蟻的chair,UC的Nut,阿里雲的aliyun-egg等,能夠看下面這張圖。node
二. 現有的Nodejs框架與Eggjs對比
mysql
Express和Koa兩個框架是同一班人發佈的,首先Koa確定先天就有express不能替代的優點,那也表明着以Koa爲基礎的egg自己比express也是有優點的。在Express這個框架在使用的時候,因爲框架的自由度很高,每一個開發者都化身爲哈姆雷特。好比實現某一個功能的時候,第一個使用者喜歡把controller和service區分開,另外一個使用者卻就喜歡寫在一塊兒,這樣的結果就是同是express的項目,換一我的來維護時,成本變得很高,由於你不知道前面開發者的騷操做到底能騷到什麼地步。而egg爲了企業中使用相同的規範去開發,自己奉行「約定大於配置」的原則,就如上面這個例子,它自己就約定了這個功能該有怎樣的規範去實現,從而使得它能在企業框架域中站住腳,發揮Koajs的價值。git
Sails框架也是一個nodejs爲基礎的企業級框架,筆者在以前一份工做中,後端正是使用這個框架,正好也對比一下這兩個框架。sails的思想是ruby語言的框架rails借鑑來的,它是以express爲基礎的一個MVC框架,自己也是奉行「約定大於配置」的原則來面向開發者,可是它自己並不屬於精巧的那種,框架自身內置了一些經常使用的功能,例如它的 blueprints,自動生成restApi路由的功能,可是其實咱們在正式開發的時候由於這個功能的不能知足咱們的要求,實際是不開啓這個功能的。它自己還集成了前端模塊進去,可是咱們只將其做爲後端服務來用,也歷來沒有使用過這些功能。而egg則很是的小巧,全部的模塊功能均以插件的模式由開發者選擇是否須要被安裝使用,徹底能夠按照本身的需求去以爲框架那些須要安裝,作的定製開發。github
下面是sails官網介紹它自己的已安裝的一些模塊,而egg自己則是以插件形式提供給開發者,由開發者決定是否安裝。sql
三. eggjs項目規範介紹docker
安裝egg數據庫
npm init egg --type=simplenpm i // 安裝依賴複製代碼
框架約定的目錄介紹
app/router.js
用於配置 URL 路由規則,具體參見 Router。
app/controller/**
用於解析用戶的輸入,處理後返回相應的結果,具體參見 Controller。
app/service/**
用於編寫業務邏輯層,可選,建議使用,具體參見 Service。
app/middleware/**
用於編寫中間件,可選,具體參見 Middleware。
app/public/**
用於放置靜態資源,可選,具體參見內置插件 egg-static。
app/extend/**
用於框架的擴展,可選,具體參見框架擴展。
config/config.{env}.js
用於編寫配置文件,具體參見配置。
config/plugin.js
用於配置須要加載的插件,具體參見插件。
test/**
用於單元測試,具體參見單元測試。
app.js
和 agent.js
用於自定義啓動時的初始化工做,可選,具體參見啓動自定義。關於agent.js
的做用參見Agent機制。
四. 實現一個接口服務
接下來使用eggjs實現一個基本的業務功能做爲入門實戰,有興趣的話請跟着一步一步練習。
1. 需求
鏈接mysql數據庫,查詢數據庫裏的數據而且提供一個http接口。
2. 實現
a. 安裝mysql而且建庫建表
筆者使用的docker在虛擬環境下使用的docker提供的mysql鏡像安裝的mysql服務,我的感受很是方便,給你們推薦一下,不過須要安裝docker(囧),直接搜一下docker安裝教程,而後在命令行裏執行安裝。
#1.下載鏡像:
docker pull mysql:5.6
#啓動,設置root初始密碼爲123456
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
# 3.進入容器:
docker exec -it mysql 建庫建表
#也可直接啓動mysql工具鏈接本機3306進行操做使用docker ps 命令查看一下啓動好的mysql:複製代碼
執行完成後使用docker ps查看mysql狀態(見下圖)。
接下來鏈接mysql,開始建表插入語句,筆者推薦datagrip工具操做數據庫,可是要收費(囧),我這邊使用免費的sequelPro。建庫建表的sql文件可使用我以前用過的一個SQL文件,建表插入數據以後看看mysql的數據。
b. 鏈接數據庫
首先使用npm安裝mysql插件egg-mysql。
npm i --save egg-mysql //安裝對應mysql插件複製代碼
接下來修改目錄下的配置文件,開啓mysql插件。
// config/plugin.js
'use strict';
module.exports = {
mysql: {
enable: true,
package: 'egg-mysql',
}
};
// config/config.default.js
const mysql = {
// 單數據庫信息配置
client: {
// host
host: '127.0.0.1',
// 端口號
port: '3306',
// 用戶名
user: 'root',
// 密碼
password: '123456',
// 數據庫名
database: 'Test_User',
},
// 是否加載到 app 上,默認開啓
app: true,
// 是否加載到 agent 上,默認關閉
agent: false,
};
module.exports = { mysql};複製代碼
c. 實現路由
// app/router.js
router.get('/user/list', controller.user.list);複製代碼
d. 新增user服務,而且新增searchAll方法
// app/service/user.js
async searchAll() {
// 假如 咱們拿到用戶 id 從數據庫獲取用戶詳細信息
const users = await this.app.mysql.select('Tab_User_Info');
return { users };
}複製代碼
e. 新增user控制器,而且新增list方法
// app/controller/user.js
'use strict';
···const userList = await ctx.service.user.searchAll();
ctx.body = {
success: true, data: userList
};
···複製代碼
f. 驗證
打開http://127.0.0.1:7001/user/list 驗證一下。
上面 使用到的代碼都可在git倉庫下獲取到。
https://github.com/FantasyGao/Practice-book/tree/master/eggjs
上面使用的sql文件地址:https://github.com/FantasyGao/About_Node/blob/master/graphql/test.sql
總結
一個完整的eggjs使用mysql進行查詢數據的功能很快就完成了,從上也可見eggjs輕巧與便捷,若是你也想使用它構建服務,請快點開始吧。
如上內容均爲本身總結,不免會有錯誤或者認識誤差,若有問題,但願你們留言指正,以避免誤人,如有什麼問題請留言,會盡力回答之。若是對你有幫助不要忘了分享給你的朋友!也能夠關注做者,查看歷史文章而且關注最新動態,助你早日成爲一名全棧工程師!