<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          阿里開源框架egg.js入門與實(shí)戰(zhàn)

          共 3863字,需瀏覽 8分鐘

           ·

          2021-12-09 17:24

          大廠技術(shù)??高級前端??Node進(jìn)階

          點(diǎn)擊上方?程序員成長指北,關(guān)注公眾號

          回復(fù)1,加入高級Node交流群

          一. Eggjs是什么?

          ? ? ? ?Eggjs是一個(gè)基于Koajs的框架,所以它應(yīng)當(dāng)屬于框架之上的框架,它繼承了Koajs的高性能優(yōu)點(diǎn),同時(shí)又加入了一些約束與開發(fā)規(guī)范,來規(guī)避Koajs框架本身的開發(fā)自由度太高的問題。

          ? ? ? Koajs是一個(gè)nodejs中比較基層的框架,它本身沒有太多約束與規(guī)范,自由度非常高,每一個(gè)開發(fā)者實(shí)現(xiàn)自己的服務(wù)的時(shí)候,都有自己的“騷操作”。而egg為了適應(yīng)企業(yè)開發(fā),加了一些開發(fā)時(shí)的規(guī)范與約束,從而解決Koajs這種自由度過高而導(dǎo)致不適合企業(yè)內(nèi)使用的缺點(diǎn),Egg便在這種背景下誕生。

          ? ? ? ?Egg是由阿里巴巴團(tuán)隊(duì)開源出來的一個(gè)“蛋”,為什么是個(gè)蛋?蛋是有無限可能的,雞孵出的蛋生小雞,恐龍孵出來的蛋就是恐龍,這也正更好的體現(xiàn)了egg最大的一個(gè)亮點(diǎn)“插件機(jī)制”,每個(gè)公司每個(gè)團(tuán)隊(duì)甚至單個(gè)開發(fā)者都可以在這之上孵化出最適合自己的框架。像阿里內(nèi)部不同的部門之間都孵化出了合適自己的egg框架,如螞蟻的chair,UC的Nut,阿里云的aliyun-egg等,可以看下面這張圖。




          二. 現(xiàn)有的Nodejs框架與Eggjs對比

          ?Express和Koa兩個(gè)框架是同一班人發(fā)布的,首先Koa肯定先天就有express不能替代的優(yōu)勢,那也代表著以Koa為基礎(chǔ)的egg本身比express也是有優(yōu)勢的。在Express這個(gè)框架在使用的時(shí)候,由于框架的自由度很高,每個(gè)開發(fā)者都化身為哈姆雷特。比如實(shí)現(xiàn)某一個(gè)功能的時(shí)候,第一個(gè)使用者喜歡把controller和service區(qū)分開,另一個(gè)使用者卻就喜歡寫在一起,這樣的結(jié)果就是同是express的項(xiàng)目,換一個(gè)人來維護(hù)時(shí),成本變得很高,因?yàn)槟悴恢狼懊骈_發(fā)者的騷操作到底能騷到什么地步。而egg為了企業(yè)中使用相同的規(guī)范去開發(fā),本身奉行“約定大于配置”的原則,就如上面這個(gè)例子,它本身就約定了這個(gè)功能該有怎樣的規(guī)范去實(shí)現(xiàn),從而使得它能在企業(yè)框架域中站住腳,發(fā)揮Koajs的價(jià)值。

          Sails框架也是一個(gè)nodejs為基礎(chǔ)的企業(yè)級框架,筆者在之前一份工作中,后端正是使用這個(gè)框架,正好也對比一下這兩個(gè)框架。sails的思想是ruby語言的框架rails借鑒來的,它是以express為基礎(chǔ)的一個(gè)MVC框架,本身也是奉行“約定大于配置”的原則來面向開發(fā)者,但是它本身并不屬于精巧的那種,框架自身內(nèi)置了一些常用的功能,例如它的 blueprints,自動(dòng)生成restApi路由的功能,但是其實(shí)我們在正式開發(fā)的時(shí)候因?yàn)檫@個(gè)功能的不能滿足我們的要求,實(shí)際是不開啟這個(gè)功能的。它本身還集成了前端模塊進(jìn)去,但是我們只將其作為后端服務(wù)來用,也從來沒有使用過這些功能。而egg則非常的小巧,所有的模塊功能均以插件的模式由開發(fā)者選擇是否需要被安裝使用,完全可以按照自己的需求去覺得框架那些需要安裝,做的定制開發(fā)。


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




          三. eggjs項(xiàng)目規(guī)范介紹

          1. 安裝egg

          npm init egg --type=simplenpm i  // 安裝依賴
          1. 框架約定的目錄介紹

          • app/router.js?用于配置 URL 路由規(guī)則,具體參見?Router。

          • app/controller/**?用于解析用戶的輸入,處理后返回相應(yīng)的結(jié)果,具體參見?Controller。

          • app/service/**?用于編寫業(yè)務(wù)邏輯層,可選,建議使用,具體參見?Service

          • app/middleware/**?用于編寫中間件,可選,具體參見?Middleware。

          • app/public/**?用于放置靜態(tài)資源,可選,具體參見內(nèi)置插件?egg-static。

          • app/extend/**?用于框架的擴(kuò)展,可選,具體參見框架擴(kuò)展。

          • config/config.{env}.js?用于編寫配置文件,具體參見配置。

          • config/plugin.js?用于配置需要加載的插件,具體參見插件

          • test/**?用于單元測試,具體參見單元測試。

          • app.js?和?agent.js?用于自定義啟動(dòng)時(shí)的初始化工作,可選,具體參見啟動(dòng)自定義。關(guān)于agent.js的作用參見Agent機(jī)制。




          四. 實(shí)現(xiàn)一個(gè)接口服務(wù)

          接下來使用eggjs實(shí)現(xiàn)一個(gè)基本的業(yè)務(wù)功能作為入門實(shí)戰(zhàn),有興趣的話請跟著一步一步練習(xí)。

          1. 需求

          連接mysql數(shù)據(jù)庫,查詢數(shù)據(jù)庫里的數(shù)據(jù)并且提供一個(gè)http接口。

          2. 實(shí)現(xiàn)

          a. 安裝mysql并且建庫建表

          筆者使用的docker在虛擬環(huán)境下使用的docker提供的mysql鏡像安裝的mysql服務(wù),個(gè)人感覺非常方便,給大家推薦一下,不過需要安裝docker(囧),直接搜一下docker安裝教程,然后在命令行里執(zhí)行安裝。

          #1.下載鏡像:docker pull mysql:5.6#啟動(dòng),設(shè)置root初始密碼為123456docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6# 3.進(jìn)入容器:docker exec -it mysql 建庫建表#也可直接啟動(dòng)mysql工具連接本機(jī)3306進(jìn)行操作使用docker ps 命令查看一下啟動(dòng)好的mysql:

          執(zhí)行完成后使用docker ps查看mysql狀態(tài)(見下圖)。

          接下來連接mysql,開始建表插入語句,筆者推薦datagrip工具操作數(shù)據(jù)庫,但是要收費(fèi)(囧),我這邊使用免費(fèi)的sequelPro。建庫建表的sql文件可以使用我之前用過的一個(gè)SQL文件,建表插入數(shù)據(jù)之后看看mysql的數(shù)據(jù)。


          b. 連接數(shù)據(jù)庫

          首先使用npm安裝mysql插件egg-mysql。

          npm i --save egg-mysql //安裝對應(yīng)mysql插件

          ? ? ? ?接下來修改目錄下的配置文件,開啟mysql插件。

          //?config/plugin.js'use strict';
          module.exports = { mysql: { enable: true, package: 'egg-mysql', }};
          // config/config.default.jsconst mysql = { // 單數(shù)據(jù)庫信息配置 client: { // host host: '127.0.0.1', // 端口號 port: '3306', // 用戶名 user: 'root', // 密碼 password: '123456', // 數(shù)據(jù)庫名 database: 'Test_User', }, // 是否加載到 app 上,默認(rèn)開啟 app: true, // 是否加載到 agent 上,默認(rèn)關(guān)閉 agent: false,};module.exports = { mysql};


          c. 實(shí)現(xiàn)路由

          // app/router.jsrouter.get('/user/list', controller.user.list);


          d.?新增user服務(wù),并且新增searchAll方法

           // app/service/user.jsasync searchAll() {  // 假如 我們拿到用戶 id 從數(shù)據(jù)庫獲取用戶詳細(xì)信息  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. 驗(yàn)證

          打開http://127.0.0.1:7001/user/list?驗(yàn)證一下。





          上面 使用到的代碼均可在git倉庫下獲取到。

          https://github.com/FantasyGao/Practice-book/tree/master/eggjs

          上面使用的sql文件地址:https://github.com/FantasyGao/About_Node/blob/master/graphql/test.sql


          總結(jié)

          一個(gè)完整的eggjs使用mysql進(jìn)行查詢數(shù)據(jù)的功能很快就完成了,從上也可見eggjs輕巧與便捷,如果你也想使用它構(gòu)建服務(wù),請快點(diǎn)開始吧。

          Node 社群


          我組建了一個(gè)氛圍特別好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你對Node.js學(xué)習(xí)感興趣的話(后續(xù)有計(jì)劃也可以),我們可以一起進(jìn)行Node.js相關(guān)的交流、學(xué)習(xí)、共建。下方加 考拉 好友回復(fù)「Node」即可。


          ???“分享、點(diǎn)贊、在看” 支持一波??

          瀏覽 88
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久热免费在线视频 | 欧美黄色高清视频 | 欧美高清猛交xxx黑人猛交性乱 | 国产成人在线免费自拍 | 天天视频黄色 |