[nodejs] web后端開發時, 用hapi/Joi對前端提交的數據進行校驗--隨筆


在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中就只會包含存在於校驗規則之中的字段。

 

----

隨筆隨筆,隨手記錄開發中的知識點。

 


免責聲明!

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



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