egg 知識點


  • egg 的約定
約定 使用方法
路由對應controller中的方法 舉例:router.get('/', controller.home.index);,此時對應app/controller/home.js中的index方法
擴展 Application app/extend/application.js
擴展 Context app/extend/context.js;middleware 中 this 就是 ctx,例如 this.cookies.get('foo')。
擴展 Request app/extend/request.js
擴展 Response app/extend/response.js
擴展 Helper app/extend/helper.js
擴展 運行環境 比如,要為開發流程增加集成測試環境 SIT。將 EGG_SERVER_ENV 設置成 sit(並建議設置 NODE_ENV = production),啟動時會加載 config/config.sit.js,運行環境變量 app.config.env 會被設置成 sit。官方網址:https://eggjs.org/zh-cn/basics/env.html
  • 一些易混淆點
易混淆點 說明
一個常見的錯誤是把 ctx.request.body 和 ctx.body 混淆,后者其實是 ctx.response.body 的簡寫
Router params(url路徑中的部分)和 query(url中的參數)的區別 https://eggjs.org/zh-cn/basics/controller.html#queryhttps://eggjs.org/zh-cn/basics/controller.html#router-params
ctx.validate檢驗不通過會拋出異常,而app.validator.validate檢驗不通過會返回錯誤。你可以自己選擇要對這個錯誤怎么處理,是不管呢還是返回前端。
  • egg 相關庫
庫名字 作用
egg-bin egg 開發工具
egg-scripts egg 部署工具
  • egg 命令
命令 作用
$ npm run dev 進入開發環境
$ npm run start 啟動服務
$ npm run stop 停止服務
npm test 執行單元測試
npm run autod 自動檢測依賴更新
npm run lint 做代碼風格檢查
npm run debug 調試;會提示一個debug控制台網址,在瀏覽器中訪問即可,類似:chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9999/ws_proxy
npm run cov 測試的覆蓋率
  • egg 內置的功能:
內置 說明
HttpClient 來方便開發者使用 HTTP 請求。
static 插件 Egg 內置了 static 插件,線上環境建議部署到 CDN,無需該插件;static 插件默認映射 /public/* -> app/public/* 目錄
單元測試 egg-bin 內置了 mocha、thunk-mocha、power-assert、istanbul 等框架,讓你可以專注於寫單元測試,無需理會配套工具;斷言庫非常推薦使用 power-assert
  • 編寫擴展
    框架提供了一種快速擴展的方式,只需在 app/extend 目錄下提供擴展腳本即可。
// app/extend/helper.js
const moment = require('moment');
exports.relativeTime = time => moment(new Date(time * 1000)).fromNow();

在模板里面使用:

<!-- app/view/news/list.tpl -->
{{ helper.relativeTime(item.time) }}

本地開發

  • 環境配置
    本地啟動的應用是以 env: local 啟動的,讀取的配置也是 config.default.js 和 config.local.js 合並的結果。
    測試用例執行時,應用是以 env: unittest 啟動的,讀取的配置是 config.default.js 和 config.unittest.js 合並的結果。
    運行 npm test 時會自動執行 test 目錄下的以 .test.js 結尾的文件(默認 glob 匹配規則 test/**/*.test.js )。
  • 我們在編寫用例時往往想單獨執行正在編寫的用例,可以通過以下方式指定特定用例文件:
$ TESTS=test/x.test.js npm test

支持 glob 規則。

  • Mocha 支持多種形式的 reporter,默認使用 spec reporter。
    可以手動設置 TEST_REPORTER 環境變量來指定 reporter,例如使用 dot:
$ TEST_REPORTER=dot npm test
  • 指定用例超時時間
    默認執行超時時間為 30 秒。我們也可以手動指定超時時間(單位毫秒),例如設置為 5 秒:
$ TEST_TIMEOUT=5000 npm test
  • 和 test 命令一樣,cov 命令執行時,應用也是以 env: unittest 啟動的,讀取的配置也是 config.default.js 和 config.unittest.js 合並的結果。

日志輸出

  • 使用 logger 模塊
    框架內置了日志 功能,使用 logger.debug() 輸出調試信息,推薦在應用代碼中使用它。
// controller
this.logger.debug('current user: %j', this.user);

// service
this.ctx.logger.debug('debug info from service');

// app/init.js
app.logger.debug('app init');

通過 config.logger.level 來配置打印到文件的日志級別,通過 config.logger.consoleLevel 配置打印到終端的日志級別。

  • 使用 debug 模塊
    debug 模塊是 Node.js 社區廣泛使用的 debug 工具,很多模塊都使用它模塊打印調試信息,Egg 社區也廣泛采用這一機制打印 debug 信息,推薦在框架和插件開發中使用它。
    我們可以通過 DEBUG 環境變量選擇開啟指定的調試代碼,方便觀測執行過程。
    (調試模塊和日志模塊不要混淆,而且日志模塊也有很多功能,這里所說的日志都是調試信息。)
    開啟所有模塊的日志:
$ DEBUG=* npm run dev

開啟指定模塊的日志:

$ DEBUG=egg* npm run dev

單元測試也可以用 DEBUG=* npm test 來查看測試用例運行的詳細日志。

  • 執行 debug 命令時,應用也是以 env: local 啟動的,讀取的配置是 config.default.js 和 config.local.js 合並的結果。

  • Egg 的定時任務也提供了只讓一個 Worker 進程運行的能力,所以能夠通過定時任務解決的問題就不要放到 Agent 上執行。

  • 當 Worker 進程異常退出時,Master 進程會重啟一個 Worker 進程。

  • 框架會在最外層通過 try catch 統一捕獲錯誤,但是由於 setImmediate 中的代碼『跳出』了異步鏈,它里面的錯誤就無法被捕捉到了。因此在編寫類似代碼的時候一定要注意。

  • 為了保證異常可追蹤,必須保證所有拋出的異常都是 Error 類型,因為只有 Error 類型才會帶上堆棧信息,定位到問題。

  • 框架通過 onerror 插件提供了統一的錯誤處理機制。對一個請求的所有處理方法(Middleware、Controller、Service)中拋出的任何異常都會被它捕獲,並自動根據請求想要獲取的類型返回不同類型的錯誤(基於 Content Negotiation)。

  • 框架並不會將服務端返回的 404 狀態當做異常來處理,但是框架提供了當響應為 404 且沒有返回 body 時的默認響應。

  • ctx.validate檢驗不通過會拋出異常,而app.validator.validate檢驗不通過會返回錯誤。你可以自己選擇要對這個錯誤怎么處理,是不管呢還是返回前端。

  • 使用中間件

  1. 在應用中使用中間件
  2. 在框架和插件中使用中間件
  3. router 中使用中間件
    前兩種方式配置的中間件是全局的,會處理每一次請求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM