[nodejs] web後端開發時, 用hapi/Joi對前端提交的資料進行校驗--隨筆
阿新 • • 發佈:2020-08-02
在nodejs安裝@hapi/joi
npm install @hapi/joi
使用@hapi/joi
const Joi = require('@hapi/joi'); let schema = Joi.object({ username : Joi.string().required().label("使用者名稱"), password : Joi.string().required().label("密碼"), remark : Joi.string().empty("").default("").label("備註"), }); let data = { "username" : "11", "password" : "11", }; let{error, value} = schema.validate(data); if (error) { throw new Error(error.details.shift().message) }
以上被校驗的資料data中, 少了remark欄位也是可以通過, 因為在宣告校驗規則的時候, 對remark欄位未使用required(), 則此時的remark欄位由default()來指定, 而empty() 指定了remark被允許為空字串.
擴充套件
但在開發過程中, 前端提交的資料中, 可能包含有不在校驗規則中的欄位, 則會一直報錯, 如若需要前端去掉這些欄位, 又需要很大的工作量。這個問題可以通過對校驗函式的約束條件解決,分如下兩步:
第一步:允許規則之外的未知欄位
let{error, value} = schema.validate(data); /*把上面這一行程式碼,修改如下:*/ let{error, value} = schema.validate(data, {allowUnknown:true});
這樣,就算data資料中包含不在校驗規則之中的欄位,只要data通過了規則的校驗,就不會報錯了。但這裡會引發另外一個問題, 就是這些不在校驗規則的欄位也會出現在結果集value裡,如若此介面就是把需要校驗規則的欄位資料插入資料裡的話, 這些未知的欄位並不存在資料庫的表字段中, 肯定會影響輸入的。
第二步:刪除未知的元素
let{error, value} = schema.validate(data); /*把上面這一行程式碼,修改如下:*/ let{error, value} = schema.validate(data, {allowUnknown:true, stripUnknown: true});
這樣,value中就只會包含存在於校驗規則之中的欄位。
----
隨筆隨筆,隨手記錄開發中的知識點。