EggJS介面開發

来源:https://www.cnblogs.com/dahe1989/archive/2019/07/25/11246605.html
-Advertisement-
Play Games

需求 隨著Nodejs的普及,前端開發的開發場景基本可以貫穿界面交互到數據存儲,無縫實現全棧開發。最近在實現一個內部項目管理工具的時候,就嘗試了一把介面和資料庫開發。 什麼是Egg.js Egg.js是阿裡開源的一套Nodejs開發框架。Egg.js官網的介紹是: Egg.js 為企業級框架和應用而 ...


需求

隨著Nodejs的普及,前端開發的開發場景基本可以貫穿界面交互到數據存儲,無縫實現全棧開發。最近在實現一個內部項目管理工具的時候,就嘗試了一把介面和資料庫開發。

什麼是Egg.js

Egg.js是阿裡開源的一套Nodejs開發框架。Egg.js官網的介紹是:

Egg.js 為企業級框架和應用而生,我們希望由 Egg.js 孕育出更多上層框架,幫助開發團隊和開發人員降低開發和維護成本。

為什麼選擇了Egg.js,而不是Koa,Express呢,其實還是為了快速開發,減少搭建項目的時間,Egg.js已經為開發者設計了幾乎最常用的目錄結構,一切傾向於配置化,隱藏一些業務無關的技術細節。開發者可以更加著重考慮業務邏輯,然後在Egg.js和相關插件的支持下,開發功能即可。

Egg.js還提倡『約定優於配置』,這一點我也是很贊同,一致的約定能夠減少不必要的失誤,同時保證了一致的開發體驗,可以方便的維護不同的項目。

初始化項目

Egg.js提供了腳手架快速初始化項目,但是要求npm >=6.1.0,這基本不是問題。

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i 

然後啟動項目

$ npm run dev
$ open http://localhost:7001

  

目錄設計

因為Egg.js已經做了太多事情,我只需要關註app和config。

├── app
|   ├── router.js
│   ├── controller
│   |   └── home.js
│   ├── service
│   |   └── user.js     
│   ├── model
│   |   └── user.js     
├── config
|   ├── plugin.js 
|   └── config.default.js

  

app/router.js 用於配置URL路由規則,也就是你訪問的介面地址,對應的是哪個controller的邏輯。

app/controller/** 用於解析用戶的輸入,處理後返回相應的結果,這裡其實可以寫service和model的邏輯,但是按照單一職責的原則,我們會在controller主要放置參數解析和返回值,以及非資料庫操作的邏輯。

app/service/** 用於編寫業務邏輯層,可選,建議使用,你可以理解成對資料庫操作的封裝。

app/model/** 用於定義mongodb的schema,這部分很神奇的是Egg.js已經封裝mongodb鏈接資料庫,並將model綁定到了ctx上,方便調用。

config/config.default.js 用於編寫配置文件,可以配置不同的開發環境,不同的變數,但是因為業務比較單一,內部使用,所以只使用了預設設置。我的項目中配置了跨域、mongoose、csrf,等等。

config.mongoose = {
    url: "mongodb://127.0.0.1/*****",
    options: {}
};

config.cors = {
    origin: '*',  
    allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
}

config.security = {
    csrf: {
        enable: false,
    },
};

  

config/plugin.js 用於配置需要載入的插件,比如egg-mongoose,egg-cors。

module.exports = { 
    mongoose: {
        enable: true,
        package: "egg-mongoose"
    },
    cors: {
        enable: true,
        package: "egg-cors"
    }
};

  

這裡需要註意的是,很多博客提供的代碼都是ES6的代碼,在我初始化的模板中是不可行的,如下:

exports.cors = {
  enable: true,
  package: 'egg-cors',
}

  

開發項目

基礎搭建好了,開發就變得很簡單了,我遵循的邏輯是:Model-->路由-->Contoller-->Service,先設計資料庫Schema,然後增加新的路由,支持對應的Controller,然後在Service中完成資料庫操作。

router.js

router.get("/api/task", controller.task.index);
router.post("/api/task", controller.task.create);
router.put("/api/task/:id", controller.task.update);
router.delete("/api/task/:id", controller.task.destroy );

// 也可以簡寫為 
router.resources('topics', '/api/task', controller.task);

 

controller中實現的方法具體可以參考下麵的對應關係

 

MethodPathRoute NameController.Action
GET /posts posts app.controllers.posts.index
GET /posts/new new_post app.controllers.posts.new
GET /posts/:id post app.controllers.posts.show
GET /posts/:id/edit edit_post app.controllers.posts.edit
POST /posts posts app.controllers.posts.create
PUT /posts/:id post app.controllers.posts.update
DELETE /posts/:id post app.controllers.posts.destroy

 

controller/task.js
exports.index = function*() {
    // ...
    const result = yield this.service.task.index(this.params); 
    this.body = result;
};

exports.create = function*() { 
    // ...
    const result = yield this.service.task.create(this.request.body);
    this.body = result;
};

exports.update = function*() { 
    // ...
    const result = yield this.service.task.update(this.params.id, this.request.body); 
    this.body = result; 
};

exports.destroy = function*() {
    // ...
    const result = yield this.service.task.destroy(this.params); 
    this.body = result; 
};

  

service/task.js

module.exports = app => {
    class TaskService extends app.Service {
        *index(params) {
            let tasks = yield this.ctx.model.Task.find(params);
            let result = {};
            result.data = tasks;
            return result;
        }

        *create(request) {  
        }

        *update(id, request) { 
        }

        *destroy(params) { 
        }
    }
    return TaskService;
};

model/task.js

module.exports = app => {
    const mongoose = app.mongoose;
    const Schema = mongoose.Schema;
    const TaskSchema = new Schema({
        id: {type: Number},
        text: {type: String},
        type: {type: String},
        progress: {type: Number},
        open: {type: Boolean},
        start_date: {type: String},
        owner_id: [{type: String}],
        duration: {type: Number},
        parent: {type: Number}
    });
    return mongoose.model("Task", TaskSchema);
};

 

部署

Egg.js 框架內置了 egg-cluster 來啟動 Master 進程,Master 有足夠的穩定性,不再需要使用 pm2 等進程守護模塊。只需要兩個命令即可:

# 啟動服務
npm start
# 關閉服務
npm run stop

 

結語

站在巨人的肩膀上,讓我們的開發效率倍增,但是還是建議大家先從Koa2學起,對然後對比Egg.js,你就會瞭解它到底封裝了哪些東西,為我們節省了多少工作量,後面還要繼續對Egg.js的插件開發進行瞭解。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySql 嚴格模式 [TOC] MySQL的sql_mode合理設置 sql model 常用來解決下麵幾類問題 sql_mode常用值 ONLY_FULL_GROUP_BY NO_AUTO_VALUE_ON_ZERO STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ ...
  • 文本組件(text)負責顯示文本和定義顯示樣式,下表為text常見屬性 ...
  • 版權聲明:本文為xing_star原創文章,轉載請註明出處! 本文同步自http://javaexception.com/archives/174 ViewPager作為RecyclerView的itemView出現的刷新不顯示的問題 Google搜索關鍵詞 recyclerview viewpag ...
  • 內容轉載自 "我的博客" 如果你只想找到如何用代碼解析各數據請點擊目錄"使用Java解析數據" @ "TOC" 1. 獲取原始藍牙廣播包 首先需要開啟 開發者選項 :不同Android手機打開此功能的方法基本一致,首先打開設置,然後找到系統版本號(例如MIUI系統的全部參數選項的MIUI版本),快速 ...
  • 1.智能快遞櫃(開篇) 2.智能快遞櫃(終端篇) 3.智能快遞櫃(通信篇-HTTP) 4.智能快遞櫃(通信篇-SOCKET) 5.智能快遞櫃(通信篇-Server程式) 6.智能快遞櫃(平臺篇) 7.智能快遞櫃(APP及微信公眾號) 8.智能快遞櫃SDK(聯網型鎖板) 9.智能快遞櫃SDK(串口型鎖 ...
  • 先來看一張效果圖(LICEcap錄製的有點卡, 湊合看) 理一下大概流程: 接下來實現: 彈幕視圖從底部彈上來, 依次動畫向上滾動, 出屏幕就移除加入重用隊列, 下次使用. 定義相關屬性: 1. 根據彈幕區域, 確定總共需要的彈幕itemView個數(總區域高度/最小高度),並添加到彈幕控制項底部 從 ...
  • 前言:做一名Web設計師是一件令人興奮的事。在Web技術中,JavaScript是一個經歷從被人誤解到萬眾矚目的巨大轉變,在歷史的衝擊中被留存下來的個體。因為JavaScript的引導,Web開發也從混亂無序的狀態轉變為需要經過嚴格訓練才能勝任的工作。當大家談論起Web開發時,自然會提到Web標準中 ...
  • 說明 Node.js中,以非同步(Async)回調著稱,使用了非同步,提高了程式的執行效率,但是,代碼可讀性較差的。 假如有幾個非同步操作,後一個操作需要前一個操作的執行完畢之後返回的數據才能執行下去,如果使用Node.js,就需要一層層嵌套下去,Promised對象就是針對此問題所提出來的的解決辦法。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...