可以在 Context 的實例上獲取到當前請求的 Request( ctx.request ) 和 Response( ctx.response ) 實例。
框架提供了一個 Controller 基類,并推薦所有的 Controller 都繼承于該基類實現。這個 Controller 基類有下列屬性:
框架提供了一個 Service 基類,并推薦所有的 Service 都繼承于該基類實現。 Service 基類的屬性和 Controller 基類屬性一致,訪問方式也類似
一個中間件是一個放置在 app/middleware 目錄下的單獨文件,它需要 exports 一個普通的 function,接受兩個參數:
// app/middleware/error_handler.js module.exports = () => { return async function errorHandler(ctx, next) { try { await next(); } catch (err) { // 所有的異常都在 app 上觸發一個 error 事件,框架會記錄一條錯誤日志 ctx.app.emit('error', err, ctx); const status = err.status || 500; // 生產環境時 500 錯誤的詳細錯誤內容不返回給客戶端,因為可能包含敏感信息 const error = status === 500 && ctx.app.config.env === 'prod' ? 'Internal Server Error' : err.message; // 從 error 對象上讀出各個屬性,設置到響應中 if (status === 422) { ctx.body = { code: ctx.ERROR_CODE, data: error, msg: '參數錯誤'+status }; } if (status === 500) { ctx.body = { code: 500, data: '', msg: '服務端錯誤-----'+error }; } ctx.status = 200; } }; };復制代碼
在應用中使用中間件
在應用中,我們可以完全通過配置來加載自定義的中間件,并決定它們的順序。
如果我們需要加載上面的 gzip 中間件,在 config.default.js 中加入下面的配置就完成了中間件的開啟和配置:
// 加載 errorHandler 中間件 config.middleware = ['errorHandler']復制代碼