close

一. Eggjs是什麼?

Eggjs是一個基於Koajs的框架,所以它應當屬於框架之上的框架,它繼承了Koajs的高性能優點,同時又加入了一些約束與開發規範,來規避Koajs框架本身的開發自由度太高的問題。

Koajs是一個nodejs中比較基層的框架,它本身沒有太多約束與規範,自由度非常高,每一個開發者實現自己的服務的時候,都有自己的「騷操作」。而egg為了適應企業開發,加了一些開發時的規範與約束,從而解決Koajs這種自由度過高而導致不適合企業內使用的缺點,Egg便在這種背景下誕生。

Egg是由阿里巴巴團隊開源出來的一個「蛋」,為什麼是個蛋?蛋是有無限可能的,雞孵出的蛋生小雞,恐龍孵出來的蛋就是恐龍,這也正更好的體現了egg最大的一個亮點「插件機制」,每個公司每個團隊甚至單個開發者都可以在這之上孵化出最適合自己的框架。像阿里內部不同的部門之間都孵化出了合適自己的egg框架,如螞蟻的chair,UC的Nut,阿里雲的aliyun-egg等,可以看下面這張圖。

二. 現有的Nodejs框架與Eggjs對比

Express和Koa兩個框架是同一班人發布的,首先Koa肯定先天就有express不能替代的優勢,那也代表着以Koa為基礎的egg本身比express也是有優勢的。在Express這個框架在使用的時候,由於框架的自由度很高,每個開發者都化身為哈姆雷特。比如實現某一個功能的時候,第一個使用者喜歡把controller和service區分開,另一個使用者卻就喜歡寫在一起,這樣的結果就是同是express的項目,換一個人來維護時,成本變得很高,因為你不知道前面開發者的騷操作到底能騷到什麼地步。而egg為了企業中使用相同的規範去開發,本身奉行「約定大於配置」的原則,就如上面這個例子,它本身就約定了這個功能該有怎樣的規範去實現,從而使得它能在企業框架域中站住腳,發揮Koajs的價值。

Sails框架也是一個nodejs為基礎的企業級框架,筆者在之前一份工作中,後端正是使用這個框架,正好也對比一下這兩個框架。sails的思想是ruby語言的框架rails借鑑來的,它是以express為基礎的一個MVC框架,本身也是奉行「約定大於配置」的原則來面向開發者,但是它本身並不屬於精巧的那種,框架自身內置了一些常用的功能,例如它的 blueprints,自動生成restApi路由的功能,但是其實我們在正式開發的時候因為這個功能的不能滿足我們的要求,實際是不開啟這個功能的。它本身還集成了前端模塊進去,但是我們只將其作為後端服務來用,也從來沒有使用過這些功能。而egg則非常的小巧,所有的模塊功能均以插件的模式由開發者選擇是否需要被安裝使用,完全可以按照自己的需求去覺得框架那些需要安裝,做的定製開發。

下面是sails官網介紹它本身的已安裝的一些模塊,而egg本身則是以插件形式提供給開發者,由開發者決定是否安裝。

三. eggjs項目規範介紹

安裝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初始密碼為123456docker 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.jsconst 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.jsrouter.get('/user/list', controller.user.list);

d.新增user服務,並且新增searchAll方法

// app/service/user.jsasync 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輕巧與便捷,如果你也想使用它構建服務,請快點開始吧。

如上內容均為自己總結,難免會有錯誤或者認識偏差,如有問題,希望大家留言指正,以免誤人,若有什麼問題請留言,會盡力回答之。如果對你有幫助不要忘了分享給你的朋友或者點擊右下方的「在看」哦!也可以關注作者,查看歷史文章並且關注最新動態,助你早日成為一名全棧工程師



在看點這裡

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()