[TOC]
### BetterValidate 校驗規則
## 類校驗
對于參數的校驗,Lin 提供了類校驗這種便捷,好用的方式,它會 對`ctx.request.body(上下文請求體)`、`ctx.request.query(上下文請求query參數)`、`ctx.request.header(上下文請求頭)`、`ctx.param(路由參數)`這些參數進行統一校驗 ,所以請保證你的參數名**沒有重復**。
代碼演示:
```
class RegisterValidator extends LinValidator {
constructor() {
super();
this.nickname = [
new Rule("isNotEmpty", "昵稱不可為空"),
new Rule("isLength", "昵稱長度必須在2~10之間", 2, 10)
new Rule("isInt", "分組id必須是整數,且大于0", { min: 1 })
];
this.group_id = new Rule("isInt", "分組id必須是整數,且大于0", {
min: 1
});
this.email = [
new Rule("isOptional"),
new Rule("isEmail", "電子郵箱不符合規范,請輸入正確的郵箱")
];
this.password = [
new Rule(
"matches",
"密碼長度必須在6~22位之間,包含字符、數字和 _ ",
/^[A-Za-z0-9_*&$#@]{6,22}$/
)
];
this.confirm_password = new Rule("isNotEmpty", "確認密碼不可為空");
}
validateConfirmPassword(data) {
if (!data.body.password || !data.body.confirm_password) {
return [false, "兩次輸入的密碼不一致,請重新輸入"];
}
let ok = data.body.password === data.body.confirm_password;
if (ok) {
return ok;
} else {
return [false, "兩次輸入的密碼不一致,請重新輸入"];
}
}
}
```
*****
### isOptional
`isOptional`這個 Rule 校驗, 當字段存在時,則校驗,不存在則不校驗
~~~
new Rule("isOptional", "", "pedrogao1996@gmail.com"),
~~~
當`isOptional`Rule 被賦有默認值時,這個字段就會發生變化。以`email`為例,當前端沒 有傳入這個參數時,校驗器中的`email`數據肯定是一個`undefined`。但是因為默認值的存 在,這個`email`會被賦予默認值,即`pedrogao1996@gmail.com`
*****
### 自定義規則函數
規則函數是校驗器中另一種用于對參數校驗的方式,它比顯示的 Rule 校驗具有更加的靈活 性和可操作性。下面我們以一個小例子來深入理解規則函數:
~~~
validateConfirmPassword(data) {
if (!data.body.password || !data.body.confirm_password) {
return [false, "兩次輸入的密碼不一致,請重新輸入"];
}
let ok = data.body.password === data.body.confirm_password;
if (ok) {
return ok;
} else {
return [false, "兩次輸入的密碼不一致,請重新輸入"];
}
}
~~~
首先任何一個規則函數,滿足以`validate`開頭的類方法,除`validate()`這個函數外。都 會被帶入一個重要的參數`data`。data 是前端傳入參數的容器,它的整體結構如下:
~~~
this.data = {
body: ctx.request.body, // body -> body
query: ctx.request.query, // query -> query
path: ctx.params, // params -> path
header: ctx.request.header // header -> header
};
~~~
返回值的所有可選項類似如下:
~~~
validateNameAndAge() {
// 表示校驗成功
return true;
// 校驗失敗,并給定錯誤信息
return [false,"message"]
// 校驗失敗,并給定錯誤信息,以及錯誤信息的鍵為nameAndAge
// 一般情況下,我們會默認生成鍵,如這個函數生成的鍵為 NameAndAge,當然你也可以選擇自定義
return [false,"message","nameAndAge"]
}
~~~
規則函數除了通過返回值來判斷失敗之外,還可以通過拋出異常來提前結束規則函數并校驗 失敗。如下:
~~~
validateNameAndAge() {
// 拋出異常,即校驗失敗
throw new ParametersException({ msg: "Lin will carry you!" });
// 返回true,表示校驗成功
return true;
}
~~~
這兩種方式都可以使規則函數校驗失敗,但是我們推薦你使用第一種方式,即**返回值方 式**
*****
### 繼承
校驗器提供繼承的方式,讓你的參數可以被組合校驗。
~~~
class PositiveIdValidator extends LinValidator {
constructor() {
super();
this.id = new Rule("isInt", "id必須為正整數", { min: 1 });
}
}
~~~
我們首先定義了一個`PositiveIdValidator`的校驗器,它會被 id 這個參數進行正整數校 驗,一般情況下 id 的校驗被使用的很普遍,其他的校驗器也需要使用,但是我們又不想重 新再寫一遍。因此,我們可以繼承`PositiveIdValidator`。
~~~
class UpdateUserInfoValidator extends PositiveIdValidator {
constructor() {
super();
this.group_id = new Rule("isInt", "分組id必須是正整數", {
min: 1
});
this.email = new Rule("isEmail", "電子郵箱不符合規范,請輸入正確的郵箱");
}
}
~~~
這里`UpdateUserInfoValidator`繼承了`PositiveIdValidator`,因 此`UpdateUserInfoValidator`也可對 id 參數進行校驗,而且擴展了 group\_id 和 email 兩個參數的校驗。
*****
### 別名
validator 不僅僅提供繼承,還提供另一種解放勞動力的方式——別名。如:
~~~
class PositiveIdValidator extends LinValidator {
constructor() {
super();
this.id = new Rule("isInt", "id必須為正整數", { min: 1 });
}
}
~~~
`PositiveIdValidator`會對 id 參數進行校驗,但是有時候參數的校驗邏輯是一樣的,但 是參數的名字不相同。如 uid 這個參數,它跟 id 這個參數的 Rule 一樣。那么我們是不 是還需要重新再寫一個校驗器定義一個 uid 的 Rule 了。這可行,但不優雅。
~~~
const v = await new PositiveIdValidator().validate(ctx, { id: "uid" });
~~~
我們可以通過上面的方式來給 id 一個別名,這個別名為 uid。當使用了別名之后,校驗器 不會對 id 這個參數做校驗,**但是會對 uid 這個參數做校驗**。
- 概述
- 起步
- 跨域配置
- 路徑別名
- 路由
- api版本控制
- 錯誤和異常
- 全局異常處理
- 數據庫
- 創建遷移文件
- sequelize數據類型
- 配置
- 新增
- 查詢
- 條件查詢
- 模糊查詢
- 排序查詢
- 聚合查詢
- 分組查詢
- 分頁查詢
- 修改
- 刪除
- 獲取器
- 修改器
- 靜態屬性
- 字段驗證
- 外鍵約束
- 關聯模型
- 一對一
- 一對多
- 左外連接
- 多對多
- 字段顯示隱藏
- 事務
- 字段自增
- 驗證層
- egg-validate
- indicative驗證器
- egg-validate-plus
- betterValidate
- 校驗規則
- 中間件
- 安全
- 數據加密
- 單向加密
- 示例代碼
- 封裝egg加密
- 上傳
- path模塊
- 單文件上傳
- 多文件上傳
- 按照日期存儲
- 工具函數
- egg常用工具函數
- 緩存
- 配置緩存插件
- 設置緩存
- 獲取緩存
- 刪除緩存
- 消息隊列
- rabbitMQ
- 安裝
- 簡單隊列
- 工作隊列
- 工作隊列(dispach分發)
- 消息應答和持久化
- redis
- 數據類型
- 字符串類型(String)
- 哈希類型(Hash)
- 列表(List)
- 無序集合(Set)
- 可排序集合(Zset)
- 郵件系統
- nodeMailer
- 第三方模塊
- 生成隨機數
- JWT
- JWT鑒權
- 生成Token
- 短信服務
- 阿里大魚短信驗證碼
- 發送短信邏輯
- 阿里短信Node類