- 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#query ,https://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檢驗不通過會返回錯誤。你可以自己選擇要對這個錯誤怎么處理,是不管呢還是返回前端。
-
使用中間件
- 在應用中使用中間件
- 在框架和插件中使用中間件
- router 中使用中間件
前兩種方式配置的中間件是全局的,會處理每一次請求。
