為什么需要做參數校驗
在開發中,無論是App
開發還是服務器接口
開發, 我們無法去預測用戶傳入的數據,因此參數(數據)校驗
是開發中不可或缺的一環。
例如像App
的注冊登錄表單提交頁面,就要做好多層的判斷。如:用戶名是否為空,用戶密碼是否為空,密碼長度是否足夠等等
。
那么有沒有比較優雅的方式實現呢?
如何優雅實現
這里使用的是基於validator.js封裝的Lin-Validator
,源碼是七月老師
提供。
Lin-Validator
擁有的功能:
- 參數校驗,
header,query,path,body
中的所有參數校驗
參數校驗
驗證器聲明:
const { LinValidator, Rule } = require('lin-mizar');
/**
* 正整數 參數校驗
*/
class PositiveIntegerValidator extends LinValidator {
constructor() {
// 使用 this 一定要使用 super
super()
// 數組,且關系,也就是數組中所有都滿足才能通過
this.id = [
new Rule('isInt', '需要是正整數', {
min: 1
}),
]
}
}
/**
* 更新用戶信息
*/
class UpdateInfoValidator extends LinValidator {
constructor () {
super();
this.email = [
new Rule('isOptional'),
new Rule('isEmail', '電子郵箱不符合規范,請輸入正確的郵箱')
];
this.nickname = [
new Rule('isOptional'),
new Rule('isLength', '昵稱長度必須在2~10之間', 2, 10)
]
}
}
module.exports = {
PositiveIntegerValidator,
UpdateInfoValidator
};
自定義別名使用
// 獲取書籍的喜歡狀態
router.get('/like', new Auth().m, async ctx => {
// 接口中傳遞的參數是`bkid`,為了復用 PositiveIntegerValidator 對 id 的校驗
// 這里使用了自定義別名 id: 'bkid' 來完成驗證器的調用
const v =await new PositiveIntegerValidator().validate(ctx, {
id: 'bkid'
})
const like = await Like.userLikeIt(
ctx.auth.uid, v.get('query.bkid'))
ctx.body = like
})
詳細使用
可通過npm
安裝使用lin-mizar
在package.json
中添加lin-mizar
的初始化即可:
"dependencies": {
"lin-mizar": "^0.2.1"
}
在要使用校驗器的文件引入
const { Rule, LinValidator, isNotEmpty } = require('lin-mizar');
【詳細使用參考:TaleLin/lin-cms-koa中的/app/validators/
】,方便的話順手點個star
支持一波。
咨詢請加微信:輕撩即可。