摘要:入門筆記請按照官方文檔初始化一個工程項目,按照如下步驟學習即可,如有不懂的請參考官方文檔。需要禁止此特性。定義為字符串且必須,最小長度為個字符。下面將定義統一錯誤處理的中間件進行錯誤處理。在目錄中創建目錄,對的內置對象進行擴展即可。
入門筆記
請按照官方文檔初始化一個simple工程項目,按照如下步驟學習即可,如有不懂的請參考官方文檔。
禁止csrf驗證根據如下步驟進行控制的創建,在執行Post操作的時候會出現invalid csrf token錯誤。需要禁止此特性。
創建路由/** * @param {Egg.Application} app - egg application */ module.exports = app => { const { router, controller, } = app; router.get("/", controller.home.index); // 新建資源路由 router.resources("SystemUser", "/system/user", controller.system.user); };
控制器controller.system.user,對應的是controller目錄下的system目錄里面的user.js文件
創建對應的控制器const Controller = require("egg").Controller; class SystemUserController extends Controller { async index() { const { ctx, } = this; ctx.body = "hello ! this is SystemUserController"; } } module.exports = SystemUserController;
訪問地址:localhost:7001/system/user
創建可以提交數據的控制器方法const Controller = require("egg").Controller; class SystemUserController extends Controller { async index() { const { ctx, } = this; ctx.body = "hello ! this is SystemUserController"; } async create() { const ctx = this.ctx; const user = ctx.request.body; ctx.body = user; } } module.exports = SystemUserController;
POST方法訪問網址:localhost:7001/system/user 會提示invalid csrf token錯誤。
關閉csrf驗證// configconfig.default.js // 關閉csrf驗證 config.security = { csrf: { enable: false, }, };開啟驗證
在上面的例子中,我們通過表單提交了任何數據,都會回顯到界面上,如果是數據需要存儲或者做其他業務處理,則需要對用戶輸入的數據進行驗證。
egg提供了egg-validate插件進行表單驗證
cnpm install egg-validate --save配置啟用插件
/** @type Egg.EggPlugin */ module.exports = { // had enabled by egg // static: { // enable: true, // } validate: { enable: true, package: "egg-validate", }, };使用驗證組件
首先創建一個規則,這里我們定義username是字符串而且是必須的,最大長度為8個字符。
定義password為字符串且必須,最小長度為6個字符。
ctx.validate(createRule, ctx.request.body);
通過上述語句進行參數檢查
更多規則請參考:https://github.com/node-modul...
const Controller = require("egg").Controller; // 定義本接口的請求參數的驗證規則 const createRule = { username: { type: "string", required: true, max: 8, }, password: { type: "string", required: true, min: 6, }, }; class SystemUserController extends Controller { async index() { const { ctx, } = this; ctx.body = "hello ! this is SystemUserController"; } async create() { const ctx = this.ctx; // 驗證輸入參數是否符合預期格式 ctx.validate(createRule, ctx.request.body); const user = ctx.request.body; ctx.body = user; } } module.exports = SystemUserController;測試
使用POSTMAN提交任意字段,則會提示Validation Failed (code: invalid_param)
如何查看具體錯誤信息呢。下面將定義統一錯誤處理的中間件進行錯誤處理。
在項目的app目錄中創建middleware目錄,此目錄中可以創建中間件。
創建錯誤處理中間件"use strict"; module.exports = () => { return async function errorHandler(ctx, next) { try { await next(); } catch (err) { // 控制臺輸出 console.error("MiddleWare errorHandler", err); // 所有的異常都在 app 上觸發一個 error 事件,框架會記錄一條錯誤日志 ctx.app.emit("error", err, ctx); // status 如果沒有,則統一為500 const status = err.status || 500; // 如果是500錯誤,且是生產環境,則統一顯示“Internal Server Error” const error = status === 500 && ctx.app.config.env === "prod" ? "Internal Server Error" : err; // 改變上下文狀態代碼 ctx.status = status; // 從 error 對象上讀出各個屬性,設置到響應中 ctx.body = { error, }; } }; };啟用中間件
文件configconfig.default.js中
// add your middleware config here config.middleware = [];
將其修改為包含你創建的中間件
// add your middleware config here // errorHandler 統一錯誤處理 config.middleware = [ "errorHandler" ]; // errorHandler 只在/api上生效 config.errorHandler = { match: "/api", };
如上所示,可以設置錯誤處理中間件在什么URL上面起作用。這里我們使用/api
測試路由先使用原來的路由訪問:localhost:7001/system/user
錯誤提示依舊
變更路由:打開文件:approuter.js
// router.resources("SystemUser", "/system/user", controller.system.user); router.resources("SystemUser", "/api/v1/system/user", controller.system.user);
再次訪問:localhost:7001/api/v1/system/user
提示信息會變成:
{"error":{"message":"Validation Failed","code":"invalid_param","errors":[{"message":"required","field":"username","code":"missing_field"},{"message":"required","field":"password","code":"missing_field"}]}}格式化接口返回的數據結構
在上面顯示錯誤信息中,可以看到規范的Json數據,如果開發接口,我們就需要定義統一的數據結構,以便客戶端進行解析。
在API開發中,可以定義接口的標準返回格式。通過框架擴展方式定義返回數據格式是一個非常方便的方法。
在app目錄中創建extend目錄,對egg的內置對象Helper進行擴展即可。
文件:app/extend/helper.js
"use strict"; module.exports = { /** * 調用正常情況的返回數據封裝 * @param {Object} ctx - context * @param {*} msg - message * @param {*} data - 數據 */ success(ctx, msg, data) { ctx.body = { code: 0, msg, data, }; ctx.status = 200; }, /** * 處理失敗,處理傳入的失敗原因 * @param {*} ctx - context * @param {Object} res - 返回的狀態數據 */ fail(ctx, res) { ctx.body = { code: res.code, msg: res.msg, data: res.data, }; ctx.status = 200; }, };改造統一錯誤處理
// 從 error 對象上讀出各個屬性,設置到響應中 // ctx.body = { // error, // }; // 格式化返回錯誤信息 ctx.helper.fail(ctx, { code: status, msg: error.message, data: error.errors, });測試
再次訪問:localhost:7001/api/v1/system/user
提示信息會變成:
{ "code": 422, "msg": "Validation Failed", "data": [ { "message": "required", "field": "username", "code": "missing_field" }, { "message": "required", "field": "password", "code": "missing_field" } ] }將控制器user中的返回改為標準格式
async create() { const ctx = this.ctx; // 驗證輸入參數是否符合預期格式 ctx.validate(createRule, ctx.request.body); const user = ctx.request.body; // ctx.body = user; this.ctx.helper.success(this.ctx, "ok", user); }
提交滿足要求的數據,測試正確的返回數據
username testuser
password 1234567890
提交后將返回標準的數據格式
{ "code": 0, "msg": "ok", "data": { "username": "testuser", "password": "1234567890" } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102143.html
摘要:基于對象字面量,但是獨立于任何編程語言,真正重要的是表示法本身,所以在學習之前不必先學習。鍵必須是字符串,值可以是合法的數據類型字符串數字對象數組布爾值或。布爾類型中的布爾值僅可使用小寫形式或,其他任何寫法都會報錯。 什么是JSON JSON全稱是Javascript Object Notation(對象表示法),是一種在不同平臺間傳遞數據的文本格式(數據交換格式)。常見的數據交換格式...
摘要:基于對象字面量,但是獨立于任何編程語言,真正重要的是表示法本身,所以在學習之前不必先學習。鍵必須是字符串,值可以是合法的數據類型字符串數字對象數組布爾值或。布爾類型中的布爾值僅可使用小寫形式或,其他任何寫法都會報錯。 什么是JSON JSON全稱是Javascript Object Notation(對象表示法),是一種在不同平臺間傳遞數據的文本格式(數據交換格式)。常見的數據交換格式...
摘要:第二章學習流程圖函數轉換為模塊函數轉換為模塊后,就可以靈活的使用模塊,方便代碼分類,避免代碼堆積在一個文件上。使用命令打包代碼,生成發布包打包后會生成目錄和文件發布后會多了目錄和文件,這個是發布的生成的包和相關配置文件。 head first python(第二章)--學習流程圖showImg(http://source1.godblessyuan.com/blog_head_firs...
摘要:前言本系列文章是學習過程的一個記錄初步目標是寫一個個人博客會盡可能多使用中提供的各種功能本文全部使用請確保版本足夠支持文中有不正確地方請指正地址文檔初始化項目使用腳手架初始化項目選擇初始化項目的類型項目目錄結構自定義啟動時 前言 本系列文章是Egg學習過程的一個記錄,初步目標是寫一個個人博客,會盡可能多使用Egg中提供的各種功能.本文全部使用 async 請確保Node版本足夠支持.文...
閱讀 712·2021-11-22 13:52
閱讀 1518·2021-09-27 13:36
閱讀 2818·2021-09-24 09:47
閱讀 2172·2021-09-22 15:48
閱讀 3600·2021-09-22 15:39
閱讀 1463·2019-08-30 12:43
閱讀 2918·2019-08-29 18:39
閱讀 3181·2019-08-29 12:51